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

SQL需求:按SubscriptionId获取NULL行之前的首个有效Phase日期

解决方案

要实现按SubscriptionId分组,为每条记录返回其之前最近的SubscriptionPhase非NULL的记录的Date,同时保留原Date列,可以使用SQL窗口函数完成,以下是具体实现:

方法1:兼容多数SQL Server版本(无需IGNORE NULLS)

SELECT 
    SubscriptionId,
    Date,
    SubscriptionPhase,
    -- 取当前行之前,同SubscriptionId下SubscriptionPhase非NULL的最近日期
    MAX(CASE WHEN SubscriptionPhase IS NOT NULL THEN Date END) OVER (
        PARTITION BY SubscriptionId 
        ORDER BY Date 
        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
    ) AS PreviousDate
FROM Subscriptions
ORDER BY SubscriptionId, Date;

逻辑说明

  • PARTITION BY SubscriptionId:按订阅ID分组处理
  • ORDER BY Date:在分组内按日期排序,确保只取当前行之前的记录
  • MAX(CASE ...):筛选出分组内当前行之前所有SubscriptionPhase非NULL的记录,取最大的Date(即最近的日期)

方法2:适用于SQL Server 2022及以上版本(支持IGNORE NULLS)

如果你的SQL Server版本支持IGNORE NULLS参数,可以用更直观的LAST_VALUE函数:

SELECT 
    SubscriptionId,
    Date,
    SubscriptionPhase,
    LAST_VALUE(CASE WHEN SubscriptionPhase IS NOT NULL THEN Date END) OVER (
        PARTITION BY SubscriptionId 
        ORDER BY Date 
        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
        IGNORE NULLS
    ) AS PreviousDate
FROM Subscriptions
ORDER BY SubscriptionId, Date;

逻辑说明

  • LAST_VALUE:直接取窗口范围内的最后一个非NULL值(因按Date排序,最后一个就是最近的)
  • IGNORE NULLS:忽略窗口内的NULL值,确保只取有效记录的日期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:39:59