查询各账户及产品首次享受折扣的日期及交易汇总SQL需求
交易历史表统计查询需求
现有一张海量交易历史表,包含以下字段:
- acc_nbr:账户编号
- tran_nbr:交易编号
- tran_amt:交易金额
- tran_dt:交易日期
- tran_dis:交易折扣
- tran_prd:交易产品
需要实现的查询要求:
- 按
acc_nbr(账户编号)与tran_prd(交易产品)的组合分组 - 查询每个组合首次享受折扣的交易日期(即该组合下
tran_dis > 0的最早交易日期) - 汇总每个组合所有折扣交易(
tran_dis > 0)的tran_amt总和与tran_dis总和
示例输入
| tran_dt | acc_nbr | tran_prd | tran_amt | tran_dis |
|---|---|---|---|---|
| 1-1-2020 | 666 | A | 777 | 0 |
| 3-4-2020 | 666 | A | 777 | 0 |
| 5-5-2021 | 666 | C | 222 | 18 |
| 7-1-2022 | 666 | A | 777 | 20 |
| 3-5-2023 | 666 | A | 777 | 99 |
期望输出
| acc_nbr | tran_prd | Effective dis date | tran_amt (sum) | tran_dis sum |
|---|---|---|---|---|
| 666 | A | 7-1-2022 | 1,554 | 119 |
| 666 | C | 5-5-2021 | 222 | 18 |
实现SQL示例(以MySQL为例)
SELECT acc_nbr, tran_prd, MIN(tran_dt) AS `Effective dis date`, SUM(tran_amt) AS `tran_amt (sum)`, SUM(tran_dis) AS `tran_dis sum` FROM transaction_history WHERE tran_dis > 0 GROUP BY acc_nbr, tran_prd;
说明
- 提前通过
WHERE tran_dis > 0过滤无折扣交易,既能避免无效数据干扰,也能提升海量数据场景下的查询效率 - 用
MIN(tran_dt)直接获取每个组合首次享受折扣的日期 - 分组后通过
SUM()函数直接汇总折扣交易的金额与折扣总和
内容的提问来源于stack exchange,提问作者GMS
相关产品推荐
相关产品推荐

