【问题标题】:How to query and filter the minimum value in one column while keeping the other columns in SQL如何查询和过滤一列中的最小值,同时保留 SQL 中的其他列
【发布时间】:2021-04-30 09:03:24
【问题描述】:

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

表:

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

我的目标是通过下面的结果表根据他们的 Order# 确定 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

提前感谢您的宝贵时间。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql toad


【解决方案1】:

我只是建议条件聚合:

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;

这既不需要子查询也不需要窗口函数。

【讨论】:

    【解决方案2】:

    这很容易使用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

    【讨论】:

    • 这正是我想要的!今天我了解了 Row_Number() over Partition by .... 谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 2017-04-07
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2013-04-05
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多