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

AWS Athena(Trino SQL)基于条件行生成相对递增/递减索引列

在AWS Athena(Trino SQL)中生成基于参考行的相对索引列

需要为表my_table添加relative_idx列,规则如下:

  • 满足my_date = DATE('2024-02-11') AND color = 'yellow'的行设为0
  • 其余行按结果集的行顺序,参考行之前的行依次为-1、-2…,之后的行依次为1、2…

解决方案

核心思路是先用ROW_NUMBER()为所有行按结果集顺序分配序号,提取参考行的序号后,用当前行序号减去参考行序号,即可得到相对索引值。

完整SQL代码:

WITH my_table AS (
    SELECT *
    FROM (VALUES
        (DATE '2023-02-01', 'red'),
        (DATE '2023-03-22', 'red'),
        (DATE '2023-03-30', 'red'),
        (DATE '2023-06-10', 'red'),
        (DATE '2023-06-11', 'red'),
        (DATE '2023-07-03', 'green'),
        (DATE '2023-07-09', 'green'),
        (DATE '2024-01-11', 'green'),
        (DATE '2024-02-11', 'yellow'), -- 参考行
        (DATE '2024-02-12', 'yellow'),
        (DATE '2024-02-13', 'yellow'),
        (DATE '2024-02-14', 'yellow'),
        (DATE '2022-10-20', 'blue'),
        (DATE '2022-10-21', 'blue'),
        (DATE '2022-10-22', 'blue')
    ) AS t(my_date, color)
),
ranked_rows AS (
    SELECT 
        my_date,
        color,
        ROW_NUMBER() OVER () AS row_num, -- 按结果集顺序生成行号
        CASE WHEN my_date = DATE('2024-02-11') AND color = 'yellow' THEN ROW_NUMBER() OVER () END AS ref_row_num
    FROM my_table
),
ref_num AS (
    SELECT MAX(ref_row_num) AS target_row_num -- 提取参考行的行号
    FROM ranked_rows
)
SELECT 
    rr.my_date,
    rr.color,
    rr.row_num - rn.target_row_num AS relative_idx
FROM ranked_rows rr
CROSS JOIN ref_num rn
ORDER BY rr.row_num; -- 保持原结果集顺序

执行结果

运行上述代码后,输出将完全匹配期望格式:

my_datecolorrelative_idx
2023-02-01red-8
2023-03-22red-7
2023-03-30red-6
2023-06-10red-5
2023-06-11red-4
2023-07-03green-3
2023-07-09green-2
2024-01-11green-1
2024-02-11yellow0
2024-02-12yellow1
2024-02-13yellow2
2024-02-14yellow3
2022-10-20blue4
2022-10-21blue5
2022-10-22blue6

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:47:01