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

Oracle SQL复杂关联查询:判断ID近四周是否存在操作记录

解决Table1新增"近四周活跃"列的问题

这问题我之前处理类似需求时碰到过,其实用SQL就能轻松实现,我给你两种实用方案,还会考虑到跨年的特殊情况:

方案一:用EXISTS子查询(推荐,性能更优)

这种方法会检查每条Table1记录是否在Table2存在符合条件的条目,找到匹配就立刻停止,数据量大的时候效率更高:

SELECT 
    t1.ID,
    t1.Week,
    t1.Year,
    CASE 
        WHEN EXISTS (
            SELECT 1 
            FROM Table2 t2 
            WHERE t2.ID = t1.ID
              AND t2.Year = t1.Year
              AND t2.Week BETWEEN t1.Week - 3 AND t1.Week
        ) THEN 'Y'
        ELSE 'N'
    END AS "Active in past 4 weeks"
FROM Table1 t1;

逻辑说明:

  • 对Table1的每一行,通过EXISTS检查Table2中是否有相同ID、同一年,且周数在当前周及前三周区间内的记录
  • 存在则标记为Y,否则标记为N,完全符合你的需求

方案二:用LEFT JOIN + GROUP BY

如果更习惯关联查询的写法,也可以用左连接后统计匹配数:

SELECT 
    t1.ID,
    t1.Week,
    t1.Year,
    CASE 
        WHEN COUNT(t2.ID) > 0 THEN 'Y'
        ELSE 'N'
    END AS "Active in past 4 weeks"
FROM Table1 t1
LEFT JOIN Table2 t2 
    ON t2.ID = t1.ID
    AND t2.Year = t1.Year
    AND t2.Week BETWEEN t1.Week - 3 AND t1.Week
GROUP BY t1.ID, t1.Week, t1.Year;

逻辑说明:

  • 将Table1和符合条件的Table2记录左连接,确保Table1的所有记录都保留
  • 分组后统计每个Table1记录对应的Table2匹配数,大于0说明有活跃记录,标记为Y

补充:处理跨年的特殊情况

如果你的业务中存在跨年周(比如Table1的周是1,年份是2018,前三周是2017年的52、51、50周),可以调整条件覆盖这种场景:

SELECT 
    t1.ID,
    t1.Week,
    t1.Year,
    CASE 
        WHEN EXISTS (
            SELECT 1 
            FROM Table2 t2 
            WHERE t2.ID = t1.ID
              AND (
                  -- 同一年的周区间
                  (t2.Year = t1.Year AND t2.Week BETWEEN t1.Week - 3 AND t1.Week)
                  OR 
                  -- 跨年的情况:前一年的最后几周
                  (t2.Year = t1.Year - 1 AND t2.Week BETWEEN 52 - (3 - t1.Week) AND 52)
              )
        ) THEN 'Y'
        ELSE 'N'
    END AS "Active in past 4 weeks"
FROM Table1 t1;

注意:不同地区的年周规则可能有差异(比如部分年份有53周),你可以根据自己的实际周数定义调整52这个数值。

用你给出的示例数据测试的话,两种方案都会得到你想要的结果:ID01标记为Y,ID02标记为N。

内容的提问来源于stack exchange,提问作者curzic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:23:25