【问题标题】:SQL Server : how to get the newest date in a table with several equal keysSQL Server:如何在具有多个相等键的表中获取最新日期
【发布时间】:2013-06-24 16:18:25
【问题描述】:

很遗憾,我对group byhaving 等语句的了解非常有限,因此希望您能帮助我:

我有一个观点 - 这是一段摘录 - (如果我们这里有一些欧洲人 - 它是 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 不是唯一的,我只需要mesoyear 中 val 最高的那个。

我的第一个解决方案是:

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 行
HAVING 子句中的“CWLDATEN_91.dbo.v021.mesoyear”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

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

消息 8120,第 16 级,状态 1,第 2 行
列 'CWLDATEN_91.dbo.v021.c003' 在选择列表中无效,因为它不包含在聚合函数或 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...无法解决问题?

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

谢谢!

【问题讨论】:

标签: sql sql-server group-by having accounting


【解决方案1】:

您实际上并不想要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() 为组中的行分配一个序号。因此,c015c003c074(基于 partition by 子句)具有相同值的所有行都在一个组中并被编号。订单由最近的mesoyear 优先(基于order by 子句)。所以,seqnum1 的值是最近一年的。

【讨论】:

    【解决方案2】:

    假设 SQL Server 2005 或更高版本,您可以使用 ROW_NUMBER() 解决此问题

    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 排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      相关资源
      最近更新 更多