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

PostgreSQL如何比对当前行与下一行不同列值判断30天内是否有后续就诊

问题解决方法

核心使用LEAD窗口函数获取同用户下一行的就诊开始时间,再判断日期间隔即可,你表已经提前按user和encounter_start排序,直接复用排序逻辑即可。

标准SQL写法(兼容Spark SQL、Hive、PostgreSQL等)

SELECT 
    `user`,
    encounter_start,
    encounter_stop,
    CASE 
        WHEN next_encounter_start IS NULL THEN 0
        WHEN DATEDIFF(next_encounter_start, encounter_stop) <= 30 THEN 1
        ELSE 0
    END AS subsequent_encounter_within_30_days
FROM (
    SELECT 
        *,
        LEAD(encounter_start) OVER (PARTITION BY `user` ORDER BY encounter_start) AS next_encounter_start
    FROM user_dates
) t

MySQL适配写法(如果日期字段为字符串格式)

如果你的encounter_start和encounter_stop是字符串类型存储,需要先转成日期类型再计算差值:

SELECT 
    `user`,
    encounter_start,
    encounter_stop,
    CASE 
        WHEN next_encounter_start IS NULL THEN 0
        WHEN DATEDIFF(STR_TO_DATE(next_encounter_start, '%m-%d-%Y'), STR_TO_DATE(encounter_stop, '%m-%d-%Y')) <= 30 THEN 1
        ELSE 0
    END AS subsequent_encounter_within_30_days
FROM (
    SELECT 
        *,
        LEAD(encounter_start) OVER (PARTITION BY `user` ORDER BY STR_TO_DATE(encounter_start, '%m-%d-%Y')) AS next_encounter_start
    FROM user_dates
) t

逻辑说明

  • 内层查询通过LEAD()窗口函数,按user分组后按就诊开始时间排序,取每条记录对应下一次就诊的开始时间
  • 外层通过CASE分支判断:如果没有下一次就诊(即对应用户最后一条就诊记录)直接标记为0;如果本次就诊结束时间和下一次就诊开始时间间隔小于等于30天标记为1,否则标记为0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:36:02