繁体   English   中英

Postgres选择所有列,但按列分组

[英]Postgres select all columns but group by one column

我有一个简单的表,其中包含unit_id oid,time timestamp,diag bytea。 主键是time和unit_id的组合。

此查询背后的想法是获取每个唯一unit_id的最新行(最大时​​间戳)。 但是,并不总是返回具有最新时间的每个unit_id的行。

我真的想通过unit_id进行分组,但是postgres也让我使用了diag,因为我选择了它。

SELECT DISTINCT ON(unit_id) max(time) as time, diag, unit_id 
FROM diagnostics.unit_diag_history  
GROUP BY unit_id, diag

每当你开始认为你想要一个本地化的GROUP BY时,你应该开始考虑窗口函数

我想你是在追求这样的事情:

select unit_id, time, diag
from (
    select unit_id, time, diag,
           rank() over (partition by unit_id order by time desc) as rank
    from diagnostics.unit_diag_history
) as dt
where rank = 1

您可能希望向ORDER BY添加一些内容以始终断开关系,但这不会改变整体技术。

您可以将分组选择与原始表一起加入:

SELECT d.time, d.diag, d.unit_id
FROM(
    SELECT unit_id, max(time) as max_time
    FROM diagnostics.unit_diag_history
    GROUP BY unit_id
) s JOIN diagnostics.unit_diag_history d
ON s.unit_id = d.unit_id AND s.max_time = d.time

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM