【问题标题】:Postgres select all columns but group by one columnPostgres选择所有列,但按一列分组
【发布时间】:2011-09-30 05:33:06
【问题描述】:

我有一个带有 unit_id oid、时间时间戳、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

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    任何时候你开始认为你想要一个本地化的 GROUP BY,你应该开始考虑 window functions

    我认为你追求的是这样的:

    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 中添加一些东西来持续打破平局,但这不会改变整体技术。

    【讨论】:

    • 我们可以不使用 sub select 来做到这一点吗?
    • @metdos:我想不出任何办法,但可能有办法。派生表有什么问题?
    【解决方案2】:

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

    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
    

    【讨论】:

    • 这是我在几天的谷歌搜索中找到的唯一对我有任何帮助的答案(来自 MySQL)。
    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2017-01-22
    相关资源
    最近更新 更多