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

按ID获取最新非空起止日期间的中间记录

原始数据表
idstart_valueend_valuedatevalue
1nullnull05-APR-232
1null509-APR-23null
15null15-APR-23null
1nullnull16-APR-234
1nullnull16-APR-23-1
1null816-APR-23null
21null05-APR-23null
2null909-APR-23null
29null13-APR-23null
2nullnull13-APR-231
2nullnull14-APR-23-5
2nullnull15-APR-23-3
2nullnull16-APR-23-4
2null-116-APR-23null
已获取最新起止值及对应日期的SQL
SELECT id, start_value, end_value, start_date, end_date 
FROM   ( 
    SELECT id, 
           LAST_VALUE(start_value) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS start_value, 
           LAST_VALUE(end_value) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS end_value, 
           LAST_VALUE(CASE WHEN start_value IS NOT NULL THEN "DATE" END) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS start_date, 
           LAST_VALUE(CASE WHEN end_value IS NOT NULL THEN "DATE" END) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS end_date, 
           ROW_NUMBER() OVER (PARTITION BY id ORDER BY "DATE" DESC) AS rn 
    FROM   table_name 
) 
WHERE  rn = 1
上述SQL执行结果
idstart_valueend_valuestart_dateend_date
15815-APR-2316-APR-23
29-113-APR-2316-APR-23
需求说明

编写SQL获取每个ID最新非空起止日期(即上述结果中的start_date和end_date)之间的所有中间记录,包含起止日期当天的记录。

期望结果
idstart_valueend_valuedatevalue
15null15-APR-23null
1nullnull15-APR-234
1nullnull16-APR-23-1
1null816-APR-23null
29null13-APR-23null
2nullnull13-APR-231
2nullnull14-APR-23-5
2nullnull15-APR-23-3
2nullnull16-APR-23-4
2null-116-APR-23null
解决方案SQL

可以通过CTE复用已有的最新起止日期逻辑,再关联原始表筛选符合日期范围的记录:

WITH latest_boundaries AS (
    SELECT id, start_value, end_value, start_date, end_date 
    FROM   ( 
        SELECT id, 
               LAST_VALUE(start_value) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS start_value, 
               LAST_VALUE(end_value) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS end_value, 
               LAST_VALUE(CASE WHEN start_value IS NOT NULL THEN "DATE" END) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS start_date, 
               LAST_VALUE(CASE WHEN end_value IS NOT NULL THEN "DATE" END) IGNORE NULLS OVER (PARTITION BY id ORDER BY "DATE") AS end_date, 
               ROW_NUMBER() OVER (PARTITION BY id ORDER BY "DATE" DESC) AS rn 
        FROM   table_name 
    ) 
    WHERE  rn = 1
)
SELECT t.id, t.start_value, t.end_value, t.date, t.value
FROM table_name t
JOIN latest_boundaries lb ON t.id = lb.id
WHERE t.date BETWEEN lb.start_date AND lb.end_date
ORDER BY t.id, t.date;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:58:08