如果 ID 是唯一键或主键,则替代解决方案是:
SELECT tn.ID, tn.Cat, tn.Product -- or just tn.* if all columns are to be selected
FROM
(
SELECT ID = MIN(ID)
FROM TableName
GROUP BY CAT
) x
INNER JOIN TableName tn ON
x.ID = tn.ID
嵌套的“x”查询为每个唯一类别 CAT 选择最小 ID,内部连接从 TableName 中返回具有所需 ID 的行。
原始答案。
现在它应该被读作“如果你希望列值来自同一原始行,你不应该做什么”。底部的示例已更改以显示数据如何混合。
当使用 Group By 时,TSQL 要求使用的所有列要么列在 GROUP BY 子句中,要么放在聚合函数中(MIN、MAX、AVG、COUNT 等)。
所以,我们需要选择哪些列必须是不同的,哪些列应该放在聚合函数中,哪些聚合函数适合我们的目的。
您需要该CAT
列是不同的 - 您应该 GROUP BY 它。
ID 和 PRODUCT 列不受任何条件限制 - 因此,我们可以聚合它们。在所有聚合函数中,只有 MIN 和 MAX 适合我们的目的,因为它们不会更改它们所应用的列的类型。
从您的示例中,ID 列始终获得最小值,因此最好的选择是使用 MIN。
至于 PRODUCT - 你可以同时使用 MIN 或 MAX - 我看不出你当前的例子有什么不同。
SELECT MIN(Id), Cat, MAX(Product)
FROM TableName
GROUP BY Cat
这个怎么运作:
ID CAT PRODUCT ID CAT PRODUCT
================= ================
1 21 Product1 1 21 -- 1 is minimums for CAT 21
2 21 Product2 Product2 -- Product2 is maximum for CAT 21
----------------- ----------------
3 23 Product2 3 23 Product2 -- Only one row for CAT 23
----------------- ----------------
4 24 Product3 4 24 -- 4 is minimum for CAT 24
5 24 Product5 Product5 -- Product5 is maximum for CAT 24
----------------- ----------------
6 25 Product4 6 25 -- 6 is minimum for CAT 25
7 25 Product6 Product6 -- Product6 is maximum for CAT 25
因此,结果将是:
ID CAT PRODUCT
=================
1 21 Product2
3 23 Product2
4 24 Product5
6 25 Product6
正如您所见,CAT 是不同的,但列值在行之间是混合的。