一对多关联查询中如何在Athena返回单条匹配行?
解决AWS Athena中一对多关联后按列排序取单条匹配行的问题
AWS Athena基于Presto SQL,不支持TOP语法,但可以通过窗口函数实现按指定列排序后仅返回每个关联组的单条匹配行,核心思路是用ROW_NUMBER()对每组数据排序并标记行号,再筛选行号为1的记录。
示例SQL(按指定列排序取单条)
假设你需要按B表的col3降序排序,取每个guv对应的第一条B表记录,SQL如下:
SELECT a.guv, a.col1, a.col2, b.col3, b.col4, b.col5 FROM A JOIN ( -- 先对B表按guv分组,指定列排序后标记行号 SELECT guv, col3, col4, col5, ROW_NUMBER() OVER (PARTITION BY guv ORDER BY col3 DESC) AS rn FROM B ) b ON a.guv = b.guv -- 仅保留每组排序后的第一条记录 WHERE b.rn = 1;
关键参数说明
PARTITION BY guv:按guv字段分组,确保每个guv对应的B表记录单独排序ORDER BY col3 DESC:替换成你需要用来排序的字段,DESC表示降序(取最大/最新值),ASC表示升序(取最小/最早值)WHERE b.rn = 1:筛选出每组排序后的第一条记录
若需返回所有字段的写法
如果不需要手动指定字段,也可以用子查询包裹关联后的结果,再筛选行号:
SELECT * FROM ( SELECT a.*, b.*, ROW_NUMBER() OVER (PARTITION BY a.guv ORDER BY b.col3 DESC) AS rn FROM A JOIN B ON a.guv = b.guv ) t WHERE t.rn = 1;
内容的提问来源于stack exchange,提问作者Bhargav Gundu
相关产品推荐
相关产品推荐

