如何用单条SQL查询优先返回用户的最优折扣记录?
解决方案:优先获取用户最优折扣记录
可以通过窗口函数ROW_NUMBER()实现单条查询返回每个用户的最优折扣记录,具体SQL如下:
SELECT id, user_id, country, discount, cashback, free_trial FROM ( SELECT *, -- 按用户分组,给折扣类型分配优先级序号 ROW_NUMBER() OVER ( PARTITION BY user_id ORDER BY CASE discount WHEN 'CHRISTMAS' THEN 1 -- 最优折扣排第1 WHEN 'DEFAULT' THEN 2 -- 标准折扣排第2 ELSE 3 -- 其他折扣优先级最低 END ) AS rn FROM users WHERE country = 'EUA' AND discount IN ('CHRISTMAS', 'DEFAULT') ) ranked_records WHERE rn = 1; -- 只取每个用户优先级最高的那条记录
逻辑说明
- 内层子查询:
- 用
PARTITION BY user_id将数据按用户分组,确保每个用户的记录单独处理。 - 通过
CASE语句定义折扣优先级:CHRISTMAS > DEFAULT,再用ROW_NUMBER()给每组内的记录按优先级分配序号,优先级最高的记录序号为1。
- 用
- 外层查询:
- 筛选出序号为1的记录,也就是每个用户的最优折扣记录;如果用户只有DEFAULT折扣,这条记录的序号就是1,会被保留。
验证结果
针对你的示例数据,执行该查询后会得到:
| id | user_id | country | discount | cashback | free_trial |
|---|---|---|---|---|---|
| 2 | 1 | EUA | CHRISTMAS | 20 | true |
| 3 | 3 | EUA | DEFAULT | 10 | false |
完全符合你的期望。
内容的提问来源于stack exchange,提问作者Jonathan Ferreira
相关产品推荐
相关产品推荐

