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

如何按merchant_id捕获文本内容的历史变更节点?

捕获文本内容随时间的变更

原始表结构与数据

CREATE TABLE term_changes (load_id int, merchant_id int, load_date date, terms varchar(50));
INSERT INTO term_changes (load_id, merchant_id, load_date, terms) VALUES  
(1, 1, '2023-01-05', 'Roses are red'), 
(2, 2, '2023-01-05', 'Roses are blue'), 
(3, 1, '2023-01-06', 'Roses are red'), 
(4, 2, '2023-01-06', 'Roses are blue'), 
(5, 1, '2023-01-07', 'Roses are violet'), 
(6, 2, '2023-01-07', 'Roses are blue'), 
(7, 1, '2023-01-08', 'Roses are violet'), 
(8, 2, '2023-01-08', 'Roses are yellow');

原有SQL及返回结果

原有尝试的SQL:

WITH t1 AS (SELECT load_id, merchant_id, load_date, MD5(terms) AS terms            
            FROM term_changes            
            ORDER BY merchant_id, load_id),
t2 AS (SELECT load_id,               
               merchant_id,               
               load_date,               
               terms,               
               LAG(load_id, 1) OVER (PARTITION BY merchant_id                                    
                                     ORDER BY load_id) AS prev_load_id       
       FROM t1)
SELECT *
FROM   t2        
JOIN t1 ON t1.load_id = t2.prev_load_id                   
AND t1.merchant_id = t2.merchant_id                   
AND t1.terms != t2.terms

返回结果:

load_idmerchant_idload_datetermsprev_load_idload_idmerchant_idload_dateterms
512023-01-0784df2c2124ad3fc5c8cdf76ce1d7f3e33312023-01-066becb043847fefb01e7989034cbdb136
822023-01-0890b64ad67da829652ee622e0695748fc6622023-01-070e3eb8ff97b31e8874f7b51c23f242a2

期望输出

按merchant_id分组,保留每个商家的初始值及变更后的值,且用load_id排序(单日内可能有多条记录):

load_idmerchant_idload_dateterms
112023-01-05Roses are red
512023-01-07Roses are violet
222023-01-05Roses are blue
822023-01-08Roses are yellow

解决方案SQL

WITH ranked_terms AS (
    SELECT 
        load_id,
        merchant_id,
        load_date,
        terms,
        LAG(terms) OVER (PARTITION BY merchant_id ORDER BY load_id) AS prev_terms
    FROM term_changes
)
SELECT load_id, merchant_id, load_date, terms
FROM ranked_terms
WHERE prev_terms IS NULL 
   OR prev_terms != terms
ORDER BY merchant_id, load_id;

逻辑说明

  1. 用LAG(terms)窗口函数,按商家分组、load_id排序,获取每条记录的上一条terms值
  2. 筛选两类记录:
    • prev_terms IS NULL:每个商家的第一条记录(初始值)
    • prev_terms != terms:与上一条记录内容不同的变更记录
  3. 最后按merchant_id和load_id排序,得到符合需求的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:24:56