5

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

我想获取具有不同地址(街道、城市、邮政编码)和 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,但发生了关于Date和的错误NameId

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

那么我怎样才能得到一个结果,其中列的子集是不同的?

4

3 回答 3

9

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

于 2013-08-12T11:59:21.920 回答
3

你可以使用这个查询

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小提琴

于 2013-08-12T12:17:33.507 回答
1

您也可以尝试以下查询 -

select * from myTable where id in
(
select min(id) from myTable
group by Street, City, PostalCode,ProjectID
)
于 2013-08-12T12:02:56.017 回答