如何按列少于所选列进行分组

时间:2013-08-07 07:36:24

标签: sql tsql sql-server-2005

我在这里面临一个问题(使用SQL Server 2005)。

我的SELECT查询如下所示:

SELECT 
a.str_column1, b.str_column2, c.date_column3, c.guid_column4
FROM table
....
joining the other tables here to get my columns
....
GROUP BY 
    a.str_column1, b.str_column2, c.date_column3, c.guid_column4

这将是这样的

a.str_column1    b.str_column2    c.date_column3    c.guid_column4
------------------------------------------------------------------
a1               b1                15/07/2013       someID    
a2               b2                05/06/2012       someID
a1               b1                07/08/2013       someID
....

现在我希望它按a.str_column1b.str_column2分组,只获取最新的order by c.dat_column3

a.str_column1    b.str_column2    c.date_column3    c.guid_column4
------------------------------------------------------------------
a1               b1                07/08/2013       someID
a2               b2                05/06/2012       someID

知道如何用SQL实现这个目标吗?

2 个答案:

答案 0 :(得分:4)

您可以使用ROW_NUMBER(),也可以完全取消GROUP BY

SELECT
    *
FROM (
  SELECT 
  a.str_column1, b.str_column2, c.date_column3, c.guid_column4,
  ROW_NUMBER() OVER (PARTITION BY a.str_column1, b.str_column2
                     ORDER BY c.date_column3 DESC) as rn
  FROM table
  ....
  joining the other tables here to get my columns
  ....
  --No longer needed GROUP BY a.str_column1, b.str_column2, c.date_column3, c.guid_column4
) t
WHERE t.rn = 1

为了能够查询ROW_NUMBER()函数的结果,您必须将现有查询(使用SELECT列表中的新列)放入子查询中(如上所述)或公用表表达式。

答案 1 :(得分:1)

您应该对max列使用date_column3函数,并从group by子句中删除该列,如下所示

SELECT 
a.str_column1, b.str_column2, max(c.date_column3) as column3, c.guid_column4
FROM table
....
joining the other tables here to get my columns
....
GROUP BY a.str_column1, b.str_column2,c.guid_column4