如何执行类似 "group by" 的操作以在一个字段上运行但在查询中包括所有字段
How to do something like "group by" to function on one field but include all fields in the query
假设我有以下 SQL 服务器 table:
我想要下面的结果,其中每个ID只有一条记录,它是字段A中值最小的一条,但是字段B和C也包括在内,像这样:
我将如何做到这一点?鉴于 group by in sql 服务器不允许包含不在 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 的数量,但确实如此,所以它一定不是我想的那样。
如有任何帮助,我们将不胜感激。谢谢。
试试这个:
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
SQL 服务器有一个很好的 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];
假设我有以下 SQL 服务器 table:
我想要下面的结果,其中每个ID只有一条记录,它是字段A中值最小的一条,但是字段B和C也包括在内,像这样:
我将如何做到这一点?鉴于 group by in sql 服务器不允许包含不在 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 的数量,但确实如此,所以它一定不是我想的那样。
如有任何帮助,我们将不胜感激。谢谢。
试试这个:
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
SQL 服务器有一个很好的 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];