在列子集上选择DISTINCT和GROUP BY [英] Select distinct and group by on subset of columns

查看:18
本文介绍了在列子集上选择DISTINCT和GROUP BY的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用SQL Server 2008,我陷入了DISTINCTGROUP BY之间的恶性循环

我有以下虚拟表格myTable

ID   Street         City          PostalCode   ProjectID   Date        NameId
1    Bar Street     Sunny Beach   666          7           25/08/2013  111
2    Sin Street     Ibiza         999          5           12/06/2013  222 
3    Bar Street     Sunny Beach   666          7           07/08/2013  333
4    Bora Bora      Bora Bora     1000         10          17/07/2013  444
5    Sin Street     Ibiza         999          5           04/07/2013  555
我希望获得具有不同地址(街道、城市、邮政编码)和项目ID的所有记录(可能是第一次出现)。 例如,此处的结果应为:

ID   Street         City          PostalCode   ProjectID   Date        NameId
1    Bar Street     Sunny Beach   666          7           25/08/2013  111
2    Sin Street     Ibiza         999          5           12/06/2013  222 
4    Bora Bora      Bora Bora     1000         10          17/07/2013  444

我尝试在所有列上使用DISTINCT,但这不起作用,因为ID是唯一的,并且总是返回所有列。我也尝试了Group by Street, City PostalCode ProjectID,但关于DateNameId出现错误。

Column '' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

那么如何才能得到列的子集是不同的结果呢?

推荐答案

您要使用row_number()函数:

select t.ID, t.Street, t.City, t.PostalCode, t.ProjectID, t.Date, t.NameId
from (select t.*,
             row_number() over (partition by Street, City, PostalCode, ProjectId
                                order by id
                               ) as seqnum
      from t
     ) t
where seqnum = 1;
这是一个窗口函数,它为某些列(由partition by子句定义)中具有相同值的行分配一个顺序值。这些行中的顺序由order by子句确定。在本例中,它从组中最低的id开始排序,因此外部查询只选择第一个。

这篇关于在列子集上选择DISTINCT和GROUP BY的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆