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

在AWS Athena中按ID查询每组最新记录并返回全列

在AWS Athena中按ID分组获取每组最新记录(支持500+列)

嘿,我刚好处理过类似的场景——在Athena里给大表(几百列那种)按ID分组取LAST_UPDATED最晚的全量记录,不用手动列所有字段的话,这两个方案绝对好使:

方案1:窗口函数ROW_NUMBER()(推荐)

这是最稳妥高效的方式,尤其适合列很多的情况,不用挨个写字段名:

WITH ranked_records AS (
    SELECT 
        *,
        -- 按ID分组,把每组里LAST_UPDATED最晚的记录标为行号1
        ROW_NUMBER() OVER (
            PARTITION BY ID 
            -- 注意:如果你的LAST_UPDATED是字符串类型,必须转成日期再排序,否则字符串排序会出错
            ORDER BY date_parse(LAST_UPDATED, '%d/%m/%Y') DESC
        ) AS rn
    FROM your_table_name -- 替换成你的表名
)
-- 选择所有列,排除我们临时加的行号列
SELECT * EXCEPT (rn)
FROM ranked_records
WHERE rn = 1;

关键细节:

  • 如果你的LAST_UPDATED已经是DATE或TIMESTAMP类型,直接写ORDER BY LAST_UPDATED DESC就行,不用date_parse
  • SELECT * EXCEPT (rn)是Athena支持的语法,完美解决几百列不用手动列举的问题
  • 如果同一ID下有多个记录的LAST_UPDATED完全相同,且你想保留所有这些“并列最新”的记录,把ROW_NUMBER()换成RANK()即可

方案2:MAX()关联(备选)

如果偏爱更直观的分组关联逻辑,也可以用这个方案,但要注意它的局限性:

SELECT t.*
FROM your_table_name t
-- 先分组找出每个ID的最晚更新时间
JOIN (
    SELECT 
        ID,
        MAX(date_parse(LAST_UPDATED, '%d/%m/%Y')) AS max_last_updated
    FROM your_table_name
    GROUP BY ID
) m 
ON t.ID = m.ID 
AND date_parse(t.LAST_UPDATED, '%d/%m/%Y') = m.max_last_updated;

优缺点:

  • ✅ 逻辑简单易懂
  • ❌ 如果同一ID下有多个记录的LAST_UPDATED等于最晚时间,会返回多条记录(如果这不是你想要的,优先方案1)
  • ❌ 对大表来说性能略逊于窗口函数(因为需要扫描两次表)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:17:30