获取 Postgres 中每个值与整体最小值的差异

Posted

技术标签:

【中文标题】获取 Postgres 中每个值与整体最小值的差异【英文标题】:Get each value's difference from overall min value in Postgres 【发布时间】:2016-07-15 23:12:30 【问题描述】:

我有一个带有时区格式(称为“时间”)的时间戳数据表。我还有一个空表,其中包含间隔数据类型值。对于空表中的每一行,我想插入原始数据中该行的时间戳与原始数据中的整体最小时间戳值之间的间隔差异。我正在尝试做这样的事情:

INSERT INTO
    time_pyramid
SELECT
    "time" - MIN("time")
FROM
    time_raw;

但它告诉我“错误:列“time_raw.time”必须出现在 GROUP BY 子句中或用于聚合函数中”。我知道我想要每个时间戳值与表的整体最小时间戳值的间隔差异,并且“时间”最终不会从这个间隔转换中得到重复的值,所以我真的不认为我应该在那种情况下使用 GROUP BY .我也认为没有理由在第一次“时间”使用聚合函数,那么如何修复我的查询以反映我想要的内容?

编辑:实际上,“将每个值作为与最小值的间隔差”是这个问题的更好标题

【问题讨论】:

【参考方案1】:

使用min() 作为window function:

with time_raw("time") as (
    values
        ('2016-01-11'::timestamp),
        ('2016-01-01'::timestamp),
        ('2016-01-21'::timestamp)
)

select 
    "time"- min("time") over () as interval
from 
    time_raw;

 interval 
----------
 10 days
 00:00:00
 20 days
(3 rows)

【讨论】:

哇,我想我将不得不阅读窗口函数。谢谢,这正是我需要的。 请注意,min("time") over () 在语法上是不可分割的。使用(extract(epoch from "time"- min("time") over ())* 1000000)::bigint 是的,我发现通过移动括号将 over () 放在里面。记得将窗口函数绑定到聚合对我有好处。

以上是关于获取 Postgres 中每个值与整体最小值的差异的主要内容,如果未能解决你的问题,请参考以下文章

R中的AIC:使用加权数据时手动值与内部值的差异

从两行中获取每个值的差异

如何在 Google Data Studio 中获得“与最小值的差异”?

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

如何从Javascript中的数组中获取最小的差异值

r 中数据集的最大值和最小值