使用 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)。
我有一个问题,我正在尝试使用 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)。