我有一个类似于Postgres的表,其中每个租户的订单计数在发生变化时被插入.

datetime tenant_id orders
2023-09-15 22:00 tenant3 2
2023-09-16 01:00 tenant1 2
2023-09-16 02:00 tenant1 3
2023-09-16 02:00 tenant2 5
2023-09-16 03:00 tenant1 4

请注意,tenant3的第一行来自昨天.租户的数量是动态的.

基于此数据,是否有可能构建一个类似时间序列的结果,其中我将所有租户的最新orders个计数相加,结果如下:

datetime sum
2023-09-16 00:00 2
2023-09-16 01:00 4
2023-09-16 02:00 10
2023-09-16 03:00 11
2023-09-16 04:00 11
... ...
2023-09-16 23:00 ...

推荐答案

SELECT dt AS datetime, sum(orders)
FROM (SELECT dt, max(datetime) AS datetime, tenant_id
      FROM generate_series(CURRENT_DATE::timestamp, CURRENT_DATE::timestamp + interval '23 hours', '1 hour') gs(dt)
      LEFT JOIN (SELECT * FROM your_table) t ON (t.datetime <= gs.dt)
      GROUP BY 1, 3) x
JOIN (SELECT datetime, tenant_id, orders FROM your_table) y USING (datetime, tenant_id)
GROUP BY 1
ORDER BY 1

子查询x生成由当天所有小时组成的时间序列,然后将其联接到表中时间更早的所有行(t.datetime <= gs.dt),然后为tenant_id和时间序列周期的每个组合找到最近的行.在子查询y中,找到最近的datetimetenant_id的每个组合的orders.在主查询中,连接两个子查询,然后计算orders个子查询的和.

这就产生了您所要求的结果,但我必须假设两件事,例如您想要当天24小时的输出.如果你想改变这一点,你应该调整generate_series()电话.您还可以进一步限制子查询x中的联接条件,使其仅计算当月的订单或满足您需要的任何订单.

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

如何实现一个广泛的多级自连接PostgreSQL查询?

从列的不同值创建列

如何在snowflake中进行SQL的反向填充

在SQL中为两个日期之间的每个日期添加行

数据库SQL PARSE_SYNTAX_ERROR

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

比较SQL中以逗号分隔的字符串

如何使用Clickhouse的COUNT聚合返回所有列,但GROUP BY是这些列的子集

使用特定的Order By子句随机化SQL输出

如何判断小数点后千位是否不为0

如何在 SQL Server 中解决这个复杂的窗口查询?

Postgresql 生成器列导致语法错误

在 Oracle 21c 中透视文本值

根据不同日期标准分配组的逻辑

如何从一张表中获取值在至少三行相同的记录

使用 PL/PGSQL 函数 Select 返回多条记录

在sql server中创建唯一标识符列

Lag() 获取snowflake的值变化

REGEXP 用于字符串格式化以对用空格分隔的字符和数字进行分组