1

我看过很多例子,但我无法弄清楚。对于我疲惫的大脑来说可能太简单了。我有一张表,我需要选择所有列,其中一个不同。

ID  CAT PRODUCT
=======================
1   21  Product1
2   21  Product2
3   23  Product2
4   24  Product3
5   24  Product5
6   25  Product4
7   25  Product6

我需要返回

ID  CAT PRODUCT
=======================
1   21  Product1
3   23  Product2
4   24  Product3
7   25  Product6

ID 和 PRODUCT 可能相同也可能不同。不需要条件。类别 (CAT) 需要区分。返回的值需要来自同一行。

在 Mysql 中我可以执行以下操作,但 MSSQL 不喜欢它。

SELECT * FROM 表 GROUP BY CAT

4

2 回答 2

4

要获得按 id 排序的第一行,在 cat 上不同,您可以使用它

select id, cat, product from
(
   Select *,
     ROW_NUMBER() OVER (PARTITION BY cat ORDER BY ID) as num
   from table

) t
where num = 1

这将创建组中的每个元素的数量,这些元素将由组创建(如下所示),然后选择第一个。


这样就可以了,我无法想象你为什么想要这个结果。

select max(id) , cat, max(product)
from table
group by cat

或者

select min(id) , cat, min(product)
from table
group by cat

会工作。

您需要使用聚合函数,该函数会在分组依据找到的值集中选择要使用的项目。

因此,例如,当您按 cat 分组时,您有两行需要“组合”。

1   21  Product1
2   21  Product2

对于 id 列和 product 列,如果您使用聚合函数 max(),您必须选择要使用的两个值之一,您将选择这些值中的最大值。以同样的方式 min() 会给你这些值的最小值。

于 2013-05-23T10:38:51.863 回答
2

如果 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 是不同的,但列值在行之间是混合的。

于 2013-05-23T10:40:01.213 回答