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

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;

关键逻辑说明

  1. ranked_data CTE:
    • 给每行标记target_flag,区分优先/备选目标行和非目标行。
    • 使用LAG()窗口函数,按ID分组、SEQ升序排序,直接获取当前行的上一行的SEQ和CODE值,无需手动关联。
  2. target_rows CTE:
    • 筛选出所有候选目标行(target_flag>0),再用ROW_NUMBER()给每个ID的候选行按优先级排序(target_flag越小优先级越高)。
  3. 最终筛选:
    • 只保留每个ID的最优目标行(rn=1),同时输出目标行的信息和上一行的prev_seq、prev_code。

优势对比原查询

  • 逻辑更清晰,避免了嵌套NOT EXISTS的复杂关联。
  • 直接通过窗口函数一次性获取上一行数据,性能更高效。
  • 输出字段明确区分目标行和上一行的信息,可读性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:31:21