1

group by不幸的是,我对诸如和之类的陈述的了解having非常有限,因此希望您能帮助我:

我有一个观点 - 这是一个摘录 - (如果我们这里有一些欧洲人 - 它是 Winline/Mesonic 的 v021):

ID        | Artikelbezeichnung1                 | Bez2      | mesoyear
_____________________________________________________________________
1401MA70  | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi   | 1344
1401MA70  | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi   | 1356
1401MA70  | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi   | 1356
1401MA71  | Marga ,Saracena beige,1S,33,3/33,3  | Marazzi   | 1344
1401MA71  | Marga ,Saracena beige,1S,33,3/33,3  | Marazzi   | 1356
1401MA71  | Marga ,Saracena beige,1S,33,3/33,3  | Marazzi   | 1356    
2401CR13  | Crista,Mahon rojo,1S,33,3/33,3      | Cristacer | 1332    
2401CR13  | Crista,Mahon rojo,1S,33,3/33,3      | Cristacer | 1344

所以ID不是唯一的,我只需要 val in 最高的那个mesoyear

我的第一个解决方案是:

Select 
    c015 as ID,
    c003 as Artikelbezeichnung1,
    c074 as Bez2,
    mesoyear
from 
    CWLDATEN_91.dbo.v021
group by 
    c015
having 
    mesoyear = max(mesoyear)

但这根本不起作用...

消息 8121,级别 16,状态 1,第 8
行列 'CWLDATEN_91.dbo.v021.mesoyear' 在 HAVING 子句中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

所以我只是删除了having声明,它变得“更好”:

消息 8120,级别 16,状态 1,行 2
列 'CWLDATEN_91.dbo.v021.c003' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

所以我试图通过将内容添加到“group by”来消除错误。它奏效了。

Select 
    c015 as ID,
    c003 as Artikelbezeichnung1,
    c074 as Bez2,
    max(mesoyear)
from 
    CWLDATEN_91.dbo.v021
group by 
    c015, c003, c074

给了我我想要的。

但正确的选择包含大约 24 列和一些计算。仅通过将所有列添加到...无法解决问题group by

有人可以帮我找到合适的命令吗?

谢谢!

4

2 回答 2

2

你实际上并不想要group by。您要选择每个组中的最后一行。您可以使用调用的窗口函数来执行此操作row_number()(假设您使用的是 SQL Server 2005 或更高版本):

Select v.*
from (select v.*,
             ROW_NUMBER() over (partition by c015, c003, c074 order by mesoyear desc) as seqnum
      from CWLDATEN_91.dbo.v021
     ) v
where seqnum = 1;

Row_number()为组中的行分配一个序号。c015因此,所有具有相同、c003c074(基于子句)值的行都partition by在一个组中并被编号。订单是最近mesoyear的第一个(基于order by子句)。因此,1in的值seqnum是最近一年。

于 2013-06-24T16:23:18.090 回答
1

ROW_NUMBER()您可以通过假设 SQL Server 2005 或更高版本来解决此问题

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY c015, c003, c074 ORDER BY mesoyear DESC) RowRank
      FROM CWLDATEN_91.dbo.v021)sub
WHERE RowRank = 1

ROW_NUMBER()函数只是以您指定的任何方式对行进行编号,这里它按您的关键字段分组,并按mesoyear.

于 2013-06-24T16:21:31.380 回答