T-SQL按最早的日期和唯一类别选择行

时间:2013-04-25 17:54:43

标签: sql-server tsql greatest-n-per-group

我正在使用Microsoft SQL。我有一个表,其中包含由两个不同类别和日期存储的信息。例如:

ID   Cat1   Cat2   Date/Time   Data  
1    1      A      11:00       456
2    1      B      11:01       789
3    1      A      11:01       123
4    2      A      11:05       987
5    2      B      11:06       654
6    1      A      11:06       321

我想为Cat1和Cat2的每个独特组合提取一行,我需要具有最早日期的行。在上面我想要ID = 1,2,4和5.

由于

2 个答案:

答案 0 :(得分:5)

在MSDN上查看row_number()

SELECT  *
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY date_time, id) rn
        FROM    mytable
        ) q
WHERE   rn = 1

(运行SQL Fiddle上的代码)

答案 1 :(得分:2)

Quassnoi的answer很好,但我对它如何处理重复感到有点不舒服。它似乎根据插入顺序返回,但我不确定是否可以保证? (有关结果根据广告订单的变化而变化的示例,请参阅这两个小提琴:dup at the enddup at the beginning

另外,我有点喜欢坚持使用老式的SQL,所以我会这样做(请参阅this fiddle了解它如何处理重复):

select *
from my_table t1
  left join my_table t2
    on t1.cat1 = t2.cat1
    and t1.cat2 = t2.cat2
    and t1.datetime > t2.datetime
where t2.datetime is null