【问题标题】:PostgreSQL sum of intervalsPostgreSQL 间隔总和
【发布时间】:2017-05-17 20:19:37
【问题描述】:

在我的数据库中,我有如下行:

date    , value
16:13:00, 500
16:17:00, 700
16:20:00, 0

现在我想从 16:00:00 到 17:00:00 对值进行“特殊总和”。所以直到 16:13 我们假设我们有 0。 所以特殊的总和看起来像(我会省略秒):

...
0 +     -- (16:12)
500 +   -- (16:13)
500 +   -- (16:14)
500 +   -- (16:15)
500 +   -- (16:16)
700 +   -- (16:17)
700 +   -- (16:18)
700 +   -- (16:19)
0 +     -- (16:20)
...

所以我在数据库中只有值的变化以及发生这种变化的时间。我想总结整个小时。结果应该是 4100。 使用 PostgreSQL 在 sql 中进行这种求和的最佳方法是什么?

最好的

【问题讨论】:

  • 请添加您需要的输出。如果这只是 4100 那么下面的答案是正确的。对于缺少的时间单位,最佳做法是使用 generate_series() 生成所有可能的时间间隔,然后使用 left join 您的数据并进行聚合。

标签: sql postgresql sum


【解决方案1】:

您可以先只选择时间戳的小时,然后按小时分组:

SELECT
  sum(s.value),
  s.hour
FROM
  (SELECT
    value,
    EXTRACT(HOUR FROM time) as hour
  FROM la_table) as s
GROUP BY s.hour

当然,这样你就可以得到从 15:00:00 到 15:59:59 的值。

用于播放的 SQLFiddle:http://sqlfiddle.com/#!1/d6ad1/1

【讨论】:

  • 是的,这是真的,但是您缺少“介于两者之间”的值。在数据库中,您没有“所有值”。我的数据库只包含“更改”。
【解决方案2】:

如果我的理解正确,您只是在寻找每小时的总数吗?

SELECT EXTRACT(hour FROM "date") hr,
       SUM(value) total
FROM yourtable
GROUP BY hr
ORDER BY hr;

【讨论】:

  • 我没有数据库中的所有数据。我只有“更改事件”,例如16:13:00, 500; 16:17:00, 700; 16:20:00, 0 从这些值中我必须​​得出4100 的总和。
  • 你能进一步澄清吗?如果您有时间(来自“更改事件”),那么为什么不使用我上面演示的 EXTRACT 就足够了?您是否测试了查询并查看是否返回了您所期望的结果?
【解决方案3】:

如果我理解,您希望选择在某个时间段内出现的每个条目。在此示例中,如果它在期间之前或期间期间或如果它在期间之后的期间结束,则选择时间值在 10:00 和 11:00 之间的任何行。

select * from table 
   where table.start_time < end_of_period and table.end_time > end_of_period

select * from table
   where (start_time < '2017-05-16 11:00:00') and (end_time > '2017-05-16 10:00:00')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多