2010-07-15 68 views
1

我有以下数据:SQL查询集团通过帮助

cust subject date 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust4 Subject3 2011-02-27 21:59:59.000 
Cust5 Subject1 2010-10-31 21:59:59.000 
Cust5 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-12-31 21:59:59.000 

我需要实现以下目标:

  • 集团他们的卡斯特和主题
  • 如果有2条记录与然后我需要返回具有最高日期的那个
  • 如上所述,如果日期相同,则只返回其中的一个。

查询的结果应该是:

cust subject date 
Cust1 Subject1 2010-12-31 21:59:59.000 
Cust4 Subject3 2011-02-27 21:59:59.000 
Cust5 Subject1 2010-10-31 21:59:59.000 
Cust5 Subject2 2010-10-31 21:59:59.000 
Cust6 Subject2 2010-12-31 21:59:59.000 

谁能帮助我?

我能够做到的要求,2但不是所有的3

回答

0

使用ROW_NUMBER() - 如果你还没有使用这个和其他的分区功能以前那么我可以肯定地建议考虑他们,因为他们(特别是ROW_NUMBER())有很多用途。

SELECT cust, subject, date 
FROM (
    SELECT cust, subject, date, ROW_NUMBER() OVER (PARTITION BY cust, subject ORDER BY date DESC) AS RN 
    FROM <your table> 
) SubQuery 
WHERE SubQuery.RN = 1 
+0

当然MAX([日期])工作... ROW_NUMBER()是矫枉过正。 :)不过,我喜欢它! – 2010-07-15 06:58:52

+0

我认为您需要在WHERE子句的行号列上添加'AS RN'才能正常工作... – 2010-07-15 06:59:31

+0

非常感谢。 我接受这个答案的原因是我忘记提及我还需要返回其他列,以至于我不会将它们包含在组中,也不能使用它们的聚合函数(如标题例如),它不会与正常的小组一起工作(至少不像这个那样容易)。 我会看看分区功能,它们看起来像是一个很大的节省时间。 – HaniBey 2010-07-15 07:09:01

5
SELECT cust, subject, max([date]) FROM myTable GROUP BY cust, subject; 

你真的没有一列名为date,你呢? date是一个保留字,这就是为什么它必须在上面的查询中被方括号包围。

+2

Sweet'n'simple - +1! =) – 2010-07-15 07:00:01

+1

+1用于保留字的使用。 – 2010-07-15 07:28:14

0
select cust, subject, max(date) from table group by cust, subject