从每 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()。示例:

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;

考虑存储一个适当的时间戳开始。

除此之外:“分区”会暗示窗口函数,这将是错误的工具。

【讨论】:

谢谢。对于 15 分钟等不同时段的使用,它仍然是最佳选择吗?我还需要从每组中获取第一条和最后一条记录。和 max - 绘制蜡烛图。 @koral: date:trunc() 仅涵盖基本时间单位。对于 15 分钟的间隔,您需要不同的方法,具体取决于其他未公开的信息。考虑:***.com/a/15577413/939860 或 ***.com/a/12731753/939860 或开始一个新问题将所有定义信息。

以上是关于从每 1 小时块中选择最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何从特定小时范围内的行中选择最小值?

获取二维数组中每列的第二个最小值

django 注释 max min AND first last

如何反转 UISlider 的最小值-最大值?

RatingBar如何设置评分最小值?

手写选择排序--Java