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

POSTGRES:单连接查询获取最大ts对应数据及记录总数

关联表分组统计与最新记录查询解决方案

需求说明

现有alarm和alarm_data两个带外键关联的表,需要实现:

  • 统计每个alarm_id对应的alarm_data记录总数
  • 获取每个alarm_id下alarm_data表中最新ts对应的value值
  • 最终每个alarm_id仅返回一条包含alarm_id、最新ts、记录总数的结果

问题根源

之前的查询因将value加入GROUP BY子句,导致同一alarm_id下不同value会生成多条记录,不符合需求。

解决方案

方案1:窗口函数+子查询

通过窗口函数标记最新记录,同时单独统计总数,最后关联结果:

SELECT 
    a.alarm_id,
    ad_latest.ts AS latest_ts,
    ad_latest.value AS latest_value,
    ad_count.total_records
FROM alarm a
LEFT JOIN (
    -- 统计每个alarm_id的记录总数
    SELECT 
        alarm_id,
        COUNT(*) AS total_records
    FROM alarm_data
    GROUP BY alarm_id
) ad_count ON a.alarm_id = ad_count.alarm_id
LEFT JOIN (
    -- 筛选每个alarm_id下最新的记录
    SELECT 
        alarm_id,
        ts,
        value,
        ROW_NUMBER() OVER (PARTITION BY alarm_id ORDER BY ts DESC) AS rn
    FROM alarm_data
) ad_latest ON a.alarm_id = ad_latest.alarm_id AND ad_latest.rn = 1;

方案2:聚合函数+相关子查询

直接按alarm_id分组,通过聚合函数获取最新ts,再用子查询匹配对应value:

SELECT 
    ad.alarm_id,
    MAX(ad.ts) AS latest_ts,
    -- 根据alarm_id和最新ts获取对应value
    (SELECT value FROM alarm_data WHERE alarm_id = ad.alarm_id AND ts = MAX(ad.ts)) AS latest_value,
    COUNT(*) AS total_records
FROM alarm_data ad
GROUP BY ad.alarm_id;

方案说明

  • 两种方案均避免了将value加入GROUP BY,确保每个alarm_id仅返回一条结果
  • 方案1适用于需要关联alarm表其他字段的场景,方案2更简洁,适合仅从alarm_data表获取数据的情况

内容的提问来源于stack exchange,提问作者Yatin Pandit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:35