1

我正在使用 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。

谢谢

4

2 回答 2

5

row_number()在 MSDN 上 看看。

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

(在SQL Fiddle上运行代码)

于 2013-04-25T17:59:21.997 回答
2

Quassnoi 的回答很好,但我对它处理重复数据的方式有点不舒服。它似乎根据插入顺序返回,但我不确定是否可以保证?(参见这两个小提琴的示例,其中结果根据插入顺序而变化: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
于 2013-04-25T23:20:19.673 回答