我正在使用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.
由于
答案 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 end,dup 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