问题描述
我希望得到以下结果,其中每个ID只有一条记录,并且它是字段A的最低值的记录,但是字段B和C也包括在内,例如:
我该怎么做?鉴于sql server中的group by不允许包含不在group by子句中的字段。我尝试了几件事,但结果却都是一样,但结果数量不正确,最典型的是:
SELECT a.*
FROM MyTable as a
join (SELECT [ID],min ([Field A]) as [Field A] FROM MyTable group by [ID]) as b on a.ID = b.id
where a.Field A = b.Field A and a.ID = b.ID
order by OBJECTID
根据我的理解,此操作的结果数量应该不超过唯一ID的数量,因此它一定不能按照我认为的去做。
任何帮助将不胜感激。谢谢。
解决方法
SQL Server有一个不错的TOP 1 WITH TIES
技巧,可以在这里使用:
SELECT TOP 1 WITH TIES [identity],ID,[Field A],[Field B],[Field C]
FROM yourTable
ORDER BY ROW_NUMBER() OVER (PARTITION BY id ORDER BY [Field A];
,
尝试一下:
WITH DataSource AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY FiledA ASC) rowID
FROM MyTable
)
SELECT identity,id,[field a],[field b],[field c]
FROM DataSource
WHERE [rowID] = 1