使用 SQL 汇总数据

Summarizing data using SQL

我有一个问题,我正在尝试使用 SQL 来解决,我需要您对解决方法的意见。

这是输入数据和预期输出的样子:

container_edits - This is the input table

container | units | status   |  move_time
-------------------------------------------------
XYZ       | 5     | Start    | 2018-01-01 00:00:15
XYZ       | 2     | Add      | 2018-01-01 00:01:10
XYZ       | 3     | Add      | 2018-01-01 00:02:00
XYZ       | null  | Complete | 2018-01-01 00:03:00
XYZ       | 5     | Start    | 2018-01-01 00:04:15
XYZ       | 3     | Add      | 2018-01-01 00:05:10
XYZ       | 4     | Add      | 2018-01-01 00:06:00
XYZ       | 5     | Add      | 2018-01-01 00:07:10
XYZ       | 6     | Add      | 2018-01-01 00:08:00
XYZ       | null  | Complete | 2018-01-01 00:09:00

Expected summarized output

container | loop_num | units | start_time          | end_time
------------------------------------------------------------------------
XYZ       | 1        |  10   | 2018-01-01 00:00:15 | 2018-01-01 00:03:00
XYZ       | 2        |  23   | 2018-01-01 00:04:15 | 2018-01-01 00:09:00
   

本质上,我需要根据状态标签对数据进行分区,提取分区内的最小和最大时间并获取该分区内的单元总数。我知道 window 函数的用法和 partition by 子句,但我不清楚当我需要根据列的值(在本例中为 'status' )进行分区时如何应用它。

任何关于如何解决这个问题的线索都会很有帮助。谢谢!

您可以使用 starts 的累积总和分配一个组 -- 这是您的 loop_num 其余的是聚合:

select container, loop_num, sum(units),
       min(move_time), max(move_time)
from (select ce.*,
             sum(case when status = 'Start' then 1 else 0 end) over (partition by container order by move_time) as loop_num
      from container_edits ce
     ) ce
group by container, loop_num;

Here是一个db<>fiddle(正好用到了Postgres,不过语法是标准的SQL)。