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

Sql server T-SQL按最早日期和唯一类别选择行,sql-server,tsql,greatest-n-per-group,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

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

谢谢

看看MSDN。

(在上运行代码)

查看MSDN。

(在上运行代码)

Quassnoi的很好,但我对它处理DUP的方式有点不舒服。它似乎是根据插入顺序返回的,但我不确定是否可以保证?(请参见这两个小提琴,以了解结果根据插入顺序发生变化的示例:,)

另外,如果可以的话,我有点喜欢使用老式的SQL,所以我会这样做(请参阅它如何处理DUP):

Quassnoi's很好,但我对它处理DUP的方式有点不舒服。它似乎是根据插入顺序返回的,但我不确定是否可以保证?(请参见这两个小提琴,以了解结果根据插入顺序发生变化的示例:,)

另外,如果可以的话,我有点喜欢使用老式的SQL,所以我会这样做(请参阅它如何处理DUP):


你是否已经尝试过某件事情,并得到了大量的支持,或者只是想从无到有地获得完整的解决方案?这个问题没有显示出任何研究成果。做家庭作业很重要。告诉我们你发现了什么,为什么它不能满足你的需要。这表明你花了时间来帮助自己,这使我们不必重复显而易见的答案,而且最重要的是,这有助于你得到更具体、更相关的答案。嗯,你很有帮助地称之为FAQ的链接似乎没有提到列出所有“不起作用”的答案。它还表明,如果我问一个模糊的问题,我会得到类似的答案。。。对我来说有道理。问题是我得到了一个奇妙的答案,这是我在一百万年内想不到的。至于什么不起作用,嗯,我不想解释我尝试过的所有不同的东西,它们不像选择不同的东西那样工作,因为它不会以特定的顺序返回任何东西,也不会实际返回我想要的数据。你是否已经尝试了一些东西并得到了叠加,或者只是想要从无到有的完整解决方案?这个问题没有显示任何研究成果。做家庭作业很重要。告诉我们你发现了什么,为什么它不能满足你的需要。这表明你花了时间来帮助自己,这使我们不必重复显而易见的答案,而且最重要的是,这有助于你得到更具体、更相关的答案。嗯,你很有帮助地称之为FAQ的链接似乎没有提到列出所有“不起作用”的答案。它还表明,如果我问一个模糊的问题,我会得到类似的答案。。。对我来说有道理。问题是我得到了一个奇妙的答案,这是我在一百万年内想不到的。至于什么不起作用,我不想解释我尝试过的所有不同的东西,它们不像选择distinct那样起作用,因为它不会以特定的顺序返回任何东西,也不会实际返回我想要的数据。酷。这就是诀窍。我也不知道SQL Fiddle,这很好。谢谢你。这就是诀窍。我也不知道SQL Fiddle,这很好。谢谢查看我的帖子更新,如果出现平局,它现在将返回第一个
id
。如果出现平局,您的查询将返回所有重复项。窗口函数也可以做到这一点,只要用
RANK()
替换
ROW\u NUMBER()
。查看我的后期更新,如果出现平局,它现在将返回第一个
id
。如果出现平局,您的查询将返回所有重复项。窗口函数也可以做到这一点,只需将
ROW\u NUMBER()
替换为
RANK()
SELECT  *
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY date_time, id) rn
        FROM    mytable
        ) q
WHERE   rn = 1
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