【问题标题】:Select minimum value from each 1 hour block从每 1 小时块中选择最小值
【发布时间】: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 这是两种截然不同的数据类型

标签: sql postgresql datetime aggregate-functions


【解决方案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 分钟的间隔,您需要不同的方法,具体取决于其他未公开的信息。考虑:stackoverflow.com/a/15577413/939860 或 stackoverflow.com/a/12731753/939860 或开始一个新问题将所有定义信息。
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 2023-03-11
  • 1970-01-01
  • 2020-08-19
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多