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

如何在Athena(Presto)中关联两表且仅取元数据表每月最高日对应行

AWS Athena 账单与最新元数据关联查询方案

实现逻辑

先从元数据表中筛选每个year、month、id分组下当月day值最大的唯一记录,再将过滤后的元数据与账单表直接关联即可,逻辑可直接封装为视图使用。

推荐查询语句(支持创建视图)

以下方案使用Presto内置的MAX_BY函数实现,写法简洁执行效率更高,将示例中的metadata_table替换为实际元数据表名、bill_table替换为实际账单表名、bill_with_label替换为你需要的视图名即可:

CREATE VIEW bill_with_label AS
WITH latest_metadata AS (
    SELECT 
        year,
        month,
        id,
        -- 取同组内day最大时对应的label1、label2值
        MAX_BY(label1, day) AS label1,
        MAX_BY(label2, day) AS label2
    FROM metadata_table
    GROUP BY year, month, id
)
SELECT 
    b.year,
    b.month,
    b.id,
    b.cost,
    lm.label1,
    lm.label2
FROM bill_table b
-- 若确认所有账单记录都能匹配到元数据,可将LEFT JOIN改为INNER JOIN
LEFT JOIN latest_metadata lm 
    ON b.year = lm.year 
    AND b.month = lm.month 
    AND b.id = lm.id

使用说明

视图创建完成后,直接执行SELECT * FROM bill_with_label即可获得符合要求的输出结果,和你给出的示例输出完全一致。

如果你更习惯使用窗口函数实现,也可以使用如下写法,效果完全相同:

CREATE VIEW bill_with_label AS
WITH latest_metadata AS (
    SELECT 
        year,
        month,
        id,
        label1,
        label2
    FROM (
        SELECT 
            year,
            month,
            id,
            label1,
            label2,
            ROW_NUMBER() OVER (PARTITION BY year, month, id ORDER BY day DESC) AS rn
        FROM metadata_table
    ) t
    WHERE rn = 1
)
SELECT 
    b.year,
    b.month,
    b.id,
    b.cost,
    lm.label1,
    lm.label2
FROM bill_table b
LEFT JOIN latest_metadata lm 
    ON b.year = lm.year 
    AND b.month = lm.month 
    AND b.id = lm.id

内容的提问来源于stack exchange,提问作者M. Glatki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:57:02