2013-08-07 32 views
0

我在这里面临一个问题(使用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来完成这个任务?

回答

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列表中的新列)放入到子查询(如上)或公用表表达式。

+0

我喜欢这个答案。我从来没有必要使用'OVER' /'PARTITION BY',是否有一个网站,你可以推荐读入或只是去MSDN描述? – seph

+0

@seph - MSDN页面是我通常将人们链接到的。 –

0

您sholud使用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 
+0

虽然从样本数据不清楚,我相信'guid_column4'将不会每str_column1,str_column2不变。我相信目的是获得最新的'guid_column4'和相应的日期 – Tobsey

相关问题