在postgresql中查找每天每小时每一行的列数据总和

Posted

技术标签:

【中文标题】在postgresql中查找每天每小时每一行的列数据总和【英文标题】:Finding the sum of column data of each row in each day hour in postgresql 【发布时间】:2021-08-07 11:00:41 【问题描述】:

我对 PostgreSQL 非常陌生。最近我正在研究一个数据库,其中有一个表名“store”。 store 有 item_id 作为主键。这是我的商店表中的演示数据:

id item_id supplier_id received quantity
12 34 6 2019-3-21 11:55:23 54
99 42 4 2019-3-21 11:23:12 98
19 39 6 2019-3-21 12:59:23 21
69 82 3 2019-3-21 10:29:11 32

我想制定一个查询,该查询将返回每天每小时收到的供应数量(供应 = 数量总和)。输出将包括按小时排序的当天时间。

输出将是这样的:

hour supplies
2019-3-21 11:00:00 - 11:59:59 152
2019-3-21 12:00:00 - 12:59:59 21

谁能帮我在 postgreSQL 中制定这个查询?

【问题讨论】:

【参考方案1】:

您可以在此处使用日历表方法。假设我们只需要覆盖单个日期2019-03-21 的 24 小时,我们可以尝试:

with dates as (
    select generate_series(
       (date '2019-03-21')::timestamp,
       (date '2019-03-22')::timestamp,
       interval '1 hour'
     ) as dt
)

select
    d.dt::date::text || ' ' ||
        to_char(d.dt::time,'HH24:MM:SS') || ' - ' ||
        to_char(d.dt::time + interval '1 hour' - interval '1 second', 'HH24:MM:SS') as hour,
    coalesce(sum(s.quantity), 0) as supplies
from dates d
left join store s
    on s.received >= d.dt and s.received < d.dt + interval '1 hour'
group by
    d.dt
order by
    d.dt;

Demo

注意:如果您只想查看数量总和不为零的小时,只需在上述查询中添加以下having 子句:

having sum(s.quantity) > 0

【讨论】:

谢谢。但是如果有多个日期而不是一天呢?我想要每一天每一小时。 @RayhanAhmedRakib 然后只需编辑对generate_series 的调用以从最早的日期开始,并在您要报告的最晚日期结束。 您的解决方案只能工作到 12:00,但忽略 13:00、14:00、15:00 等的供应。 我不同意。我的解决方案完全适用于您展示的示例数据。如果您有其他数据,那么可能存在一些我看不到的极端情况。 @RayhanAhmedRakib 不确定是否重要,但我编辑了答案以显示 24 小时制的小时数。我认为我的答案捕获了总和,但会在02:00 PM 下存储14:00

以上是关于在postgresql中查找每天每小时每一行的列数据总和的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySQL:遍历每一行,并计算符合条件的列数

java 操作Excel,循环每一行的列,为啥列数不相同呢。

如何获取二维数组的列数

在每一行中从多个不同的列中查找唯一值

android中gridView怎么在代码里动态设置每一列的宽度??

如何替换包含完整句子的列的每一行中的多个单词?