获取 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 中每个值与整体最小值的差异的主要内容,如果未能解决你的问题,请参考以下文章