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

如何用SQL检索URL发生变更的最早有效记录

检索URL变更的最早有效条目(排除URL未变更或NULL的行)

我有一张存储变更日志数据的表,需要检索出用户对URL进行变更的最早条目,URL未变更或为NULL的行不应出现在结果中。

表示例

IDNameURLvalid_fromvalid_tillUser_Id
1111111Max Mustermann16.09.2022 08:3020.09.2022 14:1521
1111111Max Mustermann20.09.2022 14:1522.09.2022 18:4521
1111111Max Mustermann22.09.2022 18:4525.09.2022 09:00999
1111111Max Mustermannmaxmuster.com25.09.2022 09:0001.10.2022 17:3021
1111111Max Mustermannmaxmustermann.com01.10.2022 17:3005.10.2022 12:00777
1111111Max Mustermannmax.com05.10.2022 12:00777
2121212Alexa Muelleralexa-mueller.com10.10.2022 20:4515.10.2022 06:1521
2121212Alexa Muelleralexamueller.com15.10.2022 06:1520.10.2022 16:30999
2121212Alexa Muelleralexamueller.com20.10.2022 16:30999

期望结果

IDURLvalid_fromUser_id
1111111maxmuster.com25.09.2022 09:0021
1111111maxmustermann.com01.10.2022 17:30777
1111111max.com05.10.2022 12:00777
2121212alexa-mueller.com10.10.2022 20:4521
2121212alexamueller.com15.10.2022 06:15999

尝试过的SQL及问题

我尝试了以下SQL语句,但无法返回正确的valid_from值:

SELECT DISTINCT
        id,
        url,
        first_value(valid_from) OVER (PARTITION BY id ORDER BY valid_from) as valid_from,
        first_value([User_id]) OVER (PARTITION BY id ORDER BY valid_from DESC) as [User_id],
    FROM 
        changelog
    WHERE 
        url IS NOT NULL
    ORDER BY id, valid_from ASC

解决方案

你需要识别每个ID下首次出现的新URL(包括从NULL切换到非NULL的情况),可以通过LAG()窗口函数对比当前行与上一行的URL来实现:

WITH filtered_changelog AS (
    SELECT
        id,
        url,
        valid_from,
        User_Id,
        -- 获取同一ID下上一行的URL
        LAG(url) OVER (PARTITION BY id ORDER BY valid_from) AS previous_url
    FROM changelog
    -- 先过滤掉URL为NULL的行
    WHERE url IS NOT NULL
)
SELECT
    id,
    url,
    valid_from,
    User_Id
FROM filtered_changelog
-- 保留两种情况:1. 是该ID下第一个非NULL URL;2. 当前URL与上一行不同(即发生了变更)
WHERE previous_url IS NULL OR url != previous_url
ORDER BY id, valid_from;

逻辑说明

  1. 首先用CTE过滤掉所有URL为NULL的行,同时通过LAG()获取同一ID中前一行的URL值。
  2. 然后筛选出两种行:
    • 同一ID下的第一个非NULL URL(此时previous_url为NULL)
    • 当前URL与上一行URL不同的行(即发生了URL变更的首次条目)
  3. 最终结果按ID和valid_from升序排列,与期望输出完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:10:36