在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
相关产品推荐
相关产品推荐

