从每 1 小时块中选择最小值
Posted
技术标签:
【中文标题】从每 1 小时块中选择最小值【英文标题】:Select minimum value from each 1 hour block 【发布时间】:2021-05-06 01:35:54 【问题描述】:我有数据:时间戳、值。
CREATE TABLE cgl
(
id integer NOT NULL DEFAULT nextval('cgl_id_seq'::regclass),
ts integer,
value integer
)
我想从每 1 小时获得最小值。每小时有未知数量的记录。 我或多或少(相当少)知道我应该使用分区。请指出一些例子或方向。
【问题讨论】:
如果您的表中没有timestamp
,您如何知道哪些元素属于同一小时?
字段ts
是时间戳
那么请解决您的问题。
int
不是 timestamp
这是两种截然不同的数据类型
【参考方案1】:
假设ts
应该是类型timestamp
:
SELECT date_trunc('hour', ts) AS hour, min(value) AS min_val
FROM cgl
GROUP BY 1;
date_trunc()
将时间戳截断为小时。当然,在没有任何数据的情况下,你会连续几个小时没有得到任何数据。如果您需要*每一小时的一行,请先生成一组总小时数,generate_series()
。示例:
如果ts
实际上是integer
,它可能应该是一个UNIX时代,你需要先用to_timestamp()
转换它:
SELECT date_trunc('hour', to_timestamp(ts)) AS hour, min(value) AS min_val
FROM cgl
GROUP BY 1;
考虑存储一个适当的时间戳开始。
除此之外:“分区”会暗示窗口函数,这将是错误的工具。
【讨论】:
谢谢。对于 15 分钟等不同时段的使用,它仍然是最佳选择吗?我还需要从每组中获取第一条和最后一条记录。和 max - 绘制蜡烛图。 @koral:date:trunc()
仅涵盖基本时间单位。对于 15 分钟的间隔,您需要不同的方法,具体取决于其他未公开的信息。考虑:***.com/a/15577413/939860 或 ***.com/a/12731753/939860 或开始一个新问题将所有定义信息。以上是关于从每 1 小时块中选择最小值的主要内容,如果未能解决你的问题,请参考以下文章