如何查询和过滤一列中的最小值,同时将其他列保留在 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;
我只建议条件聚合:
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 函数。
如何在 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;
我只建议条件聚合:
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 函数。