SQL中如何按CustomerID和Level分组取最小Order#生成等级首订单表
实现方案
核心逻辑
需求拆解为两步执行:
- 按
CustomerID、Level分组聚合,取每组最小的Order#,即筛选出每个客户每个等级首次达成的订单 - 将上一步的结果通过条件聚合行转列,把不同等级的订单号拆分为独立列展示
通用SQL实现(兼容所有主流数据库,可直接替换表名后运行)
SELECT CustomerID, MIN(CASE WHEN Level = 3 THEN first_order END) AS `Level 3`, MIN(CASE WHEN Level = 4 THEN first_order END) AS `Level 4`, MIN(CASE WHEN Level = 5 THEN first_order END) AS `Level 5` FROM ( -- 子查询:获取每个客户各等级的最小订单号 SELECT CustomerID, Level, -- 若Order#为字符串类型,必须转数值再取最小,避免字典序排序错误 MIN(CAST(`Order#` AS INT)) AS first_order FROM 你的真实表名 -- 替换为实际存储数据的表名 GROUP BY CustomerID, Level ) AS customer_level_order GROUP BY CustomerID
补充说明
- 若
Order#本身就是数值类型,可去掉CAST转换逻辑,直接写为MIN(\Order#`)`即可 - 若客户未达到对应等级,对应列默认返回
NULL,需要替换为默认值(如0)时,可用COALESCE(对应列, 替换值)包裹对应字段 - 运行结果完全匹配给出的样例输出,无冗余数据
内容的提问来源于stack exchange,提问作者Cherrycoke
相关产品推荐
相关产品推荐

