You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

90天内交易分类:按O_id统一标记交易状态的SQL需求

机构交易记录批量标记需求

表结构

  • 交易唯一ID:T_id(Transaction_id)
  • 交易日期:Dt(Date)
  • 发起交易的账户ID:Ac_id(account-id)
  • 机构ID:O_id(Org_id),同一机构可对应多个不同Ac_id

示例数据

T_idDtAc_idO_id
10123/4/221A
10206/7/223C
10301/8/222A
10413/3/226B

需求说明

若某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_idDtAc_idO_idMark
10123/4/221A0
10206/7/223C1
10301/8/222A1
10413/3/226B0

期望输出结果

T_idDtAc_idO_idMark
10123/4/221A1
10206/7/223C1
10301/8/222A1
10413/3/226B0

核心要求:只要机构有任意一笔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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:24:28