选择distinct并按列子集进行分组

时间:2013-08-12 11:57:18

标签: sql sql-server-2008 distinct

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

我希望获得具有不同地址(街道,城市,邮政编码)和ProjectID的所有记录(可能是第一次出现)。 例如,此处的结果应为:

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.

那么如何得到一个结果,其中列的子集是不同的?

3 个答案:

答案 0 :(得分:8)

您想使用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进行排序,因此外部查询只选择第一个。

答案 1 :(得分:2)

您可以使用此查询

select myTable.*
from (select myTable.*,
             row_number() over (partition by Street, City, PostalCode, Projected
                                order by id
                               ) as rowid
      from myTable
     ) myTable
where rowid = 1;

SQL Fiddle

答案 2 :(得分:1)

您也可以尝试使用以下查询 -

select * from myTable where id in
(
select min(id) from myTable
group by Street, City, PostalCode,ProjectID
)