Postgres:获取对应于组中其他列的最大值的列的值

Posted

技术标签:

【中文标题】Postgres:获取对应于组中其他列的最大值的列的值【英文标题】:Postgres: Get value of a column corresponding to max of other column in a group 【发布时间】:2021-02-19 14:13:01 【问题描述】:

我正在尝试编写一个 postgres 查询,它返回组中的最大值、最小值、中值、第一个和最后一个值以及每个聚合值的时间戳

表格

Id Timestamp_utc                  Value
1  2020-11-05 15:36:15.768388     10
1  2020-11-05 15:40:15.768388     20
1  2020-11-05 15:44:15.768388     30
1  2020-11-05 15:45:15.768388.    5
1  2020-11-05 15:59:15.768388     25
1  2020-11-05 16:59:15.768388     25

预期结果

Id Median Median_Timestamp Min Min_Timestamp               Max Max_TimeStamp
1  17.5.  15:44:15.768388  5   2020-11-05 15:45:15.768388  30   2020-11-05 15:44:15.768388

我有这个查询,其中分组数据不包括时间戳

SELECT Id, time_bucket('60', timestamp_utc) AS bucket,
percentile_cont(0.5) within group (order by value) median_value,
min(value) min_value, 
max(value) max_value 
FROM rs.MyTable 
WHERE id IN ( 1111,123)
AND timestamp_utc Between '2020-11-05 10:00:15.748643' and '2020-11-05 16:35:48.750313'
GROUP BY id, bucket 
ORDER BY id, bucket

当值最大时,我是否可以获取时间戳列以及 timestamp_utc col 数据等聚合值?

【问题讨论】:

【参考方案1】:

一个选项在子查询中使用窗口函数通过递增和递减value 对时间戳进行排名,然后在外部查询中进行条件聚合以带来相关值

select id, bucket,
    percentile_cont(0.5) within group (order by value) median_value,
    min(value) min_value, 
    max(timestamp_utc) filter(where rn_asc = 1) min_timestamp,
    max(value) max_value,
    max(timestamp_utc) filter(where rn_desc = 1) max_timestamp
from (
    select t.*, 
        row_number() over(partition by id, bucket order by value) rn_asc,
        row_number() over(partition by id, bucket order by value desc) rn_desc
    from (
        select t.*, time_bucket('60', timestamp_utc) as bucket 
        from rs.mytable t
        where 
            id in (1111,123)
            and timestamp_utc between '2020-11-05 10:00:15.748643'::timestamp 
                                  and '2020-11-05 16:35:48.750313'::timestamp
    ) t
) t
group by id, bucket 
order by id, bucket

注意,我们需要先计算bucket,然后放到window function的partition中。

【讨论】:

感谢您的回答,但上述查询始终为最小值和最大值提供 NULL 时间戳,尽管表行具有最大值和最小值的时间戳 我认为 time_bucket 函数搞砸了? @DoIt:是的,这是可能的。如果从查询中删除它是否有效? 是的,但我每个 id 只能得到一行,这对我来说不是预期的情况 @DoIt:这可能是可行的......但这不是你首先问的问题!您可能想为此提出一个新问题。

以上是关于Postgres:获取对应于组中其他列的最大值的列的值的主要内容,如果未能解决你的问题,请参考以下文章

基于组 ID 子集的时间戳列的组中的最后一行 - Postgres

如何获取组中对象的画布相对位置?

如何相对于组中的值获得行号

在特定列 postgres 中选择具有最大值的组中的行

如何使用 WordPress API 在 PHP 中获取 MySQL 表的列的最大值

SQL查询以获取与另一列的MAX值对应的列值?