我正在使用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.
那么如何得到一个结果,其中列的子集是不同的?
答案 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;
答案 2 :(得分:1)
您也可以尝试使用以下查询 -
select * from myTable where id in
(
select min(id) from myTable
group by Street, City, PostalCode,ProjectID
)