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 函数,这将是错误的工具。
我有数据:时间戳,值。
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 函数,这将是错误的工具。