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

如何编写SQL查询筛选先访问低收益页面后访问高收益页面的用户IP

你的现有代码思路问题

你目前写的SQL逻辑完全不符合需求,核心问题有3个:

  • 外层User和Visit没有加关联条件,会产生笛卡尔积,返回大量冗余重复数据
  • EXISTS子查询没有和外层的用户做绑定,只要表中存在任意一条rev>10的访问记录,所有用户的IP都会被返回,完全没有过滤出符合条件的用户
  • 没有实现「先有rev<5的低收益访问、后有rev>10的高收益访问」的时间顺序判断,也没有加低收益的筛选条件
正确实现方案

核心思路是对Visit表做自关联,匹配同一个用户的两次访问,保证低收益访问的时间早于高收益访问的时间,再关联User表取IP即可,注意要去重避免同一个用户多次符合条件返回重复结果:

SELECT DISTINCT u.ip
FROM "User" u
JOIN Visit v_low ON u.uid = v_low.uid
JOIN Visit v_high ON u.uid = v_high.uid
WHERE v_low.rev < 5 
  AND v_high.rev > 10
  -- 注意要把dt转成日期类型比较,避免字符串格式的日期比较出错
  AND TO_DATE(v_low.dt, 'MM/DD/YYYY') < TO_DATE(v_high.dt, 'MM/DD/YYYY');

如果你的SQL环境支持窗口函数,也可以用窗口函数先给每个用户的访问按时间排序,再判断是否有符合条件的记录:

WITH user_visit_rnk AS (
  SELECT 
    uid, rev, dt,
    -- 标记当前记录之前是否存在低收益访问
    MAX(CASE WHEN rev <5 THEN 1 ELSE 0 END) OVER (PARTITION BY uid ORDER BY TO_DATE(dt, 'MM/DD/YYYY') ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) has_low_before
  FROM Visit
)
SELECT DISTINCT u.ip
FROM "User" u
JOIN user_visit_rnk vr ON u.uid = vr.uid
WHERE vr.rev >10 AND vr.has_low_before =1;

示例数据测试说明

你提供的示例数据中,用户A只有1条高收益访问,没有低收益访问;用户B的高收益访问时间是2003-05-19,低收益访问时间是2004-05-20,低收益在高收益之后,不符合条件,所以上述SQL在示例数据中返回空结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:39:00