如何查询和过滤一列中的最小值,同时将其他列保留在 SQL 中

How to query and filter the minimum value in one column while keeping the other columns in SQL

如何在 SQL 中仅保留一列中的最小值,同时保留其他列中的其余数据?我正在尝试过滤字段 'OrderID' 以按 CustomerID 和 Level 显示最低订单#。

Table:

Order# |CustomerID | Level
12345  | 200       | 3
12389  | 200       | 3
12590  | 200       | 3
12790  | 200       | 4
13091  | 200       | 5
15678  | 500       | 3
15788  | 500       | 4
16100  | 500       | 4
16990  | 500       | 5
17331  | 600       | 3
17660  | 600       | 4
17700  | 600       | 5

我的目标是通过下面的结果 table 来确定 CustomerID 何时根据他们的订单号首次达到级别 3、4、5。

删除所有其他达到级别后的订单号,并创建新的级别 3、级别 4 和级别 5 列以指示满足这些级别阈值的订单号。

结果

CustomerID | Level 3 | Level 4| Level 5
200        | 12345   | 12790  | 13091
500        | 15678   | 15788  | 16990
600        | 17331   | 17660  | 17700

提前感谢您的宝贵时间。

这很容易使用ROW_NUMBER来处理:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerID, Level ORDER BY OrderNo) rn
    FROM yourTable
)

SELECT
    CustomerID,
    MAX(CASE WHEN Level = 3 AND rn = 1 THEN OrderNo END) AS Level3,
    MAX(CASE WHEN Level = 4 AND rn = 1 THEN OrderNo END) AS Level4,
    MAX(CASE WHEN Level = 5 AND rn = 1 THEN OrderNo END) AS Level5
FROM cte
GROUP BY CustomerID
ORDER BY CustomerID;

Demo

我只建议条件聚合:

SELECT CustomerID,
       MIN(CASE WHEN Level = 3 THEN OrderNo END) AS Level3,
       MIN(CASE WHEN Level = 4 THEN OrderNo END) AS Level4,
       MIN(CASE WHEN Level = 5 THEN OrderNo END) AS Level5
FROM t
GROUP BY CustomerID
ORDER BY CustomerID;

为此既不需要子查询也不需要 window 函数。