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
相关产品推荐
相关产品推荐

