获得每组的第一行

时间:2015-09-15 13:05:48

标签: sql-server cross-apply

我想转换这些数据

account; docdate; docnum
17700; 9/11/2015; 1
17700; 9/12/2015; 2
70070; 9/1/2015; 4
70070; 9/2/2015; 6
70070; 9/3/2015; 9

进入这个

account; docdate; docnum
17700; 9/12/2015; 2
70070; 9/3/2015; 9

..对于每个帐户,我想拥有一行最新(= max(docdate))docdate。我已经尝试了cross applyrow_number的不同方法,但无法达到预期效果

1 个答案:

答案 0 :(得分:1)

使用ROW_NUMBER

SELCT account, docdate, docnum
FROM (
  SELECT account, docdate, docnum,
         ROW_NUMBER() OVER (PARTITION BY account 
                            ORDER BY docdate DESC) AS rn
  FROM mytable ) AS t
WHERE t.rn = 1 

PARTITION BY account子句创建共享相同account值的行片。 ORDER BY docdate DESC将具有最大docdate值的记录放在其相关切片的顶部。因此rn = 1指向每个docdate分区中具有最大account值的记录。