Select 每 1 小时区块的最小值

Select minimum value from each 1 hour block

我有数据:时间戳,值。

CREATE TABLE cgl
(
    id integer NOT NULL DEFAULT nextval('cgl_id_seq'::regclass),
    ts integer,
    value integer
)

我想要每 1 小时的最小值。每小时有未知数量的记录。 我或多或少(相当少)知道我应该使用分区。请给我指出一些例子或方向。

假设 ts 应该是类型 timestamp:

SELECT date_trunc('hour', ts) AS hour, min(value) AS min_val
FROM   cgl
GROUP  BY 1;

date_trunc() 将时间戳截断为小时。当然,如果没有任何数据,你会在几个小时内没有一行。如果您需要一行*每小时,请首先生成一组带有 generate_series() 的总小时数。示例:

  • Join a count query on a generate_series in postgres and also retrieve Null-values as "0"

如果ts实际上是integer,那应该是UNIX纪元,需要先用to_timestamp()转换一下:

SELECT date_trunc('hour', to_timestamp(ts)) AS hour, min(value) AS min_val
FROM   cgl
GROUP  BY 1;

考虑存储一个正确的时间戳作为开始。

旁白:“分区”会暗示 window 函数,这将是错误的工具。