Teradata SQL:如何获取目标序列行及其上一行的SEQ与CODE信息?
解决方案
要实现选中目标行并同时获取其同一ID下SEQ值更小的上一行的SEQ和CODE,可借助Teradata窗口函数简化逻辑并完成需求,具体调整如下:
修改后的查询代码
CREATE MULTISET VOLATILE TABLE DOM AS ( WITH ranked_data AS ( SELECT ID, SEQ, CODE, RESULT, -- 标记候选目标行:1=优先保留的SEQ=450+LT,2=备选的SEQ=650+LT,0=非目标行 CASE WHEN SEQ = 450 AND RESULT = 'LT' THEN 1 WHEN SEQ = 650 AND RESULT = 'LT' THEN 2 ELSE 0 END AS target_flag, -- 直接获取同一ID下按SEQ升序排列的上一行的SEQ和CODE LAG(SEQ) OVER (PARTITION BY ID ORDER BY SEQ ASC) AS prev_seq, LAG(CODE) OVER (PARTITION BY ID ORDER BY SEQ ASC) AS prev_code FROM MASTER ), target_rows AS ( -- 筛选每个ID的最优目标行(优先取target_flag=1的行) SELECT ID, SEQ, CODE, RESULT, prev_seq, prev_code, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY target_flag ASC) AS rn FROM ranked_data WHERE target_flag > 0 ) SELECT ID, SEQ AS target_seq, CODE AS target_code, RESULT, prev_seq, prev_code FROM target_rows WHERE rn = 1 ) WITH DATA PRIMARY INDEX (ID, target_seq) ON COMMIT PRESERVE ROWS;
关键逻辑说明
ranked_dataCTE:- 给每行标记
target_flag,区分优先/备选目标行和非目标行。 - 使用
LAG()窗口函数,按ID分组、SEQ升序排序,直接获取当前行的上一行的SEQ和CODE值,无需手动关联。
- 给每行标记
target_rowsCTE:- 筛选出所有候选目标行(
target_flag>0),再用ROW_NUMBER()给每个ID的候选行按优先级排序(target_flag越小优先级越高)。
- 筛选出所有候选目标行(
- 最终筛选:
- 只保留每个ID的最优目标行(
rn=1),同时输出目标行的信息和上一行的prev_seq、prev_code。
- 只保留每个ID的最优目标行(
优势对比原查询
- 逻辑更清晰,避免了嵌套
NOT EXISTS的复杂关联。 - 直接通过窗口函数一次性获取上一行数据,性能更高效。
- 输出字段明确区分目标行和上一行的信息,可读性更强。
内容的提问来源于stack exchange,提问作者User771
相关产品推荐
相关产品推荐

