90天内交易分类:按O_id统一标记交易状态的SQL需求
机构交易记录批量标记需求
表结构
- 交易唯一ID:
T_id(Transaction_id) - 交易日期:
Dt(Date) - 发起交易的账户ID:
Ac_id(account-id) - 机构ID:
O_id(Org_id),同一机构可对应多个不同Ac_id
示例数据
| T_id | Dt | Ac_id | O_id |
|---|---|---|---|
| 101 | 23/4/22 | 1 | A |
| 102 | 06/7/22 | 3 | C |
| 103 | 01/8/22 | 2 | A |
| 104 | 13/3/22 | 6 | B |
需求说明
若某O_id存在90天内的交易,则该O_id对应的所有交易记录的Mark字段标记为1,否则标记为0。
当前错误实现
使用的SQL语句:
Select *, Case when datediff('day', Dt, current_date()) between 0 and 90 then '1' Else '0' End as Mark From Table1
当前输出结果
| T_id | Dt | Ac_id | O_id | Mark |
|---|---|---|---|---|
| 101 | 23/4/22 | 1 | A | 0 |
| 102 | 06/7/22 | 3 | C | 1 |
| 103 | 01/8/22 | 2 | A | 1 |
| 104 | 13/3/22 | 6 | B | 0 |
期望输出结果
| T_id | Dt | Ac_id | O_id | Mark |
|---|---|---|---|---|
| 101 | 23/4/22 | 1 | A | 1 |
| 102 | 06/7/22 | 3 | C | 1 |
| 103 | 01/8/22 | 2 | A | 1 |
| 104 | 13/3/22 | 6 | B | 0 |
核心要求:只要机构有任意一笔90天内的交易,该机构所有记录的Mark都为1,无论单条交易是否在90天内。
解决方案
方法1:子查询关联(通用SQL)
先筛选出所有存在90天内交易的O_id,再关联原表完成标记:
SELECT t1.*, CASE WHEN t2.O_id IS NOT NULL THEN '1' ELSE '0' END AS Mark FROM Table1 t1 LEFT JOIN ( SELECT DISTINCT O_id FROM Table1 WHERE DATEDIFF('day', Dt, CURRENT_DATE()) BETWEEN 0 AND 90 ) t2 ON t1.O_id = t2.O_id;
方法2:窗口函数(高效方案,适用于支持窗口函数的数据库)
用窗口函数批量判断每个O_id是否有符合条件的交易:
SELECT *, CASE WHEN MAX(CASE WHEN DATEDIFF('day', Dt, CURRENT_DATE()) BETWEEN 0 AND 90 THEN 1 ELSE 0 END) OVER (PARTITION BY O_id) = 1 THEN '1' ELSE '0' END AS Mark FROM Table1;
注意事项
不同数据库的日期计算函数参数逻辑有差异,可按需调整:
- MySQL:用
DATEDIFF(CURDATE(), Dt)判断天数差 - SQL Server:用
DATEDIFF(day, Dt, GETDATE()) - PostgreSQL:用
CURRENT_DATE - Dt <= INTERVAL '90 days'直接判断日期范围
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

