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

Ant*_*lev 4 sql distinct sql-server-2008

我使用的是SQL Server 2008和我被困在这之间的恶性循环DISTINCT,并GROUP 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
Run Code Online (Sandbox Code Playgroud)

我想获得具有不同地址(Street,City,PostalCode)和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
Run Code Online (Sandbox Code Playgroud)

我已尝试过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.
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 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;
Run Code Online (Sandbox Code Playgroud)

这是一个窗口函数,它为某些列(由partition by子句定义)中具有相同值的行分配顺序值.这些行中的排序由该order by子句决定.在这种情况下,它开始以id组中的最低顺序排序,因此外部查询只选择第一个.