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

Amazon Redshift中按id筛选最大value所属nested_id全量时序数据的SQL实现

实现方案

Amazon Redshift支持标准SQL窗口函数,用窗口函数是最简洁高效的实现方式,不需要嵌套多层子查询,两种可行写法如下:

写法1:用RANK窗口函数(兼容多nested_id同最大value的场景)

WITH ranked_nested AS (
    SELECT 
        *,
        RANK() OVER (PARTITION BY id ORDER BY value DESC) AS value_rnk
    FROM mytable
    WHERE id IN (1, 2)
),
target_nested AS (
    SELECT DISTINCT id, nested_id
    FROM ranked_nested
    WHERE value_rnk = 1
)
SELECT t.id, t.nested_id, t.date, t.value
FROM mytable t
INNER JOIN target_nested tn
    ON t.id = tn.id 
    AND t.nested_id = tn.nested_id
WHERE t.id IN (1, 2)
ORDER BY t.id, t.date;

逻辑说明:

  • 先按id分组,给组内所有行按value倒序排名,最大value的行排名为1
  • 提取每个id下排名为1的所有nested_id(如果多个nested_id的value同为最大值,会全部返回)
  • 关联回原表即可拿到目标nested_id的全量时序数据

写法2:用FIRST_VALUE窗口函数(更精简)

SELECT id, nested_id, date, value
FROM (
    SELECT 
        *,
        FIRST_VALUE(nested_id) OVER (
            PARTITION BY id 
            ORDER BY value DESC 
            ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
        ) AS target_nested_id
    FROM mytable
    WHERE id IN (1, 2)
) t
WHERE nested_id = target_nested_id
ORDER BY id, date;

逻辑说明:

  • 直接在子查询中计算每个id分组下最大value对应的nested_id
  • 外层过滤出nested_id和目标值一致的行即可得到结果

如果存在多个nested_id对应同一个最大value的情况,想要只取其中一个,可以把RANK换成ROW_NUMBER,并在窗口排序规则中补充你需要的优先级字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:54:05