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

SQL需求:添加日期差条件修改同一ID的Column A返回值

解决SQL记录日期差判断并修改字段值的问题

需求说明

现有同一ID的多条记录,所有记录的Column A当前均为'Yes'。需添加逻辑:按ID分组并按记录日期排序后,若最新记录与上一条记录的日期差≥90天,则将该最新记录的Column A改为'NO'。

示例数据:

IDColumn ARecord date
001Yes2022-07-11 12:05:34.067-07:00
001Yes2022-02-01 10:08:34.067-07:00

解决方案

利用窗口函数LAG()获取上一条记录的日期,结合ROW_NUMBER()标记最新记录,再通过CASE WHEN实现字段值修改。以下是不同主流数据库的适配代码:

通用版(PostgreSQL等支持标准INTERVAL语法的数据库)

SELECT
    ID,
    CASE
        WHEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY "Record date" DESC) = 1
             AND "Record date" - LAG("Record date") OVER (PARTITION BY ID ORDER BY "Record date") >= INTERVAL '90 days'
        THEN 'NO'
        ELSE "Column A"
    END AS "Column A",
    "Record date"
FROM
    your_table_name
ORDER BY
    ID, "Record date" DESC;

MySQL版

SELECT
    ID,
    CASE
        WHEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY `Record date` DESC) = 1
             AND DATEDIFF(`Record date`, LAG(`Record date`) OVER (PARTITION BY ID ORDER BY `Record date`)) >= 90
        THEN 'NO'
        ELSE `Column A`
    END AS `Column A`,
    `Record date`
FROM
    your_table_name
ORDER BY
    ID, `Record date` DESC;

SQL Server版

SELECT
    ID,
    CASE
        WHEN ROW_NUMBER() OVER (PARTITION BY ID ORDER BY [Record date] DESC) = 1
             AND DATEDIFF(day, LAG([Record date]) OVER (PARTITION BY ID ORDER BY [Record date]), [Record date]) >= 90
        THEN 'NO'
        ELSE [Column A]
    END AS [Column A],
    [Record date]
FROM
    your_table_name
ORDER BY
    ID, [Record date] DESC;

代码逻辑解释

  • PARTITION BY ID:按ID分组处理每条记录,确保只对比同一ID下的记录
  • ROW_NUMBER() OVER (...) = 1:标记每个ID下的最新记录(按日期降序排列,第一条即为最新)
  • LAG("Record date") OVER (...):获取当前记录的上一条(更早的)记录日期
  • 日期差判断:通过对应数据库的日期函数,计算两条记录的天数差,满足≥90天则修改Column A值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:15:36