【问题标题】:SQL Query For Grouping Data Based On Several Particular Pattern?基于几种特定模式对数据进行分组的 SQL 查询?
【发布时间】:2021-07-19 11:13:12
【问题描述】:

假设我有一张这样的桌子:

id |stop_duration | moving_duration | zone
1  |           20 |              10 | WAREHOUSE
2  |            5 |             100 | HAUL
3  |           15 |               5 | CHECKPOINT
4  |            3 |             130 | HAUL
5  |           30 |              10 | WAREHOUSE
6  |            6 |              95 | HAUL
7  |           15 |               5 | CHECKPOINT
8  |            8 |              90 | HAUL
9  |           25 |              10 | WAREHOUSE

所以我想按旅行分组。行程由 WAREHOUSE 行组成,直到另一个 WAREHOUSE 行之前。

因此,对于该表,一次行程由 id 为 1、2、3 和 4 的行组成。另一个行程由 id 为 5、6、7 和 8 的行组成。

分组后,我想计算stop_duration和moving_duration的总和。

是否可以仅使用 SQL 查询来做到这一点?如果不是,我需要使用什么样的工具?

【问题讨论】:

    标签: sql data-analysis data-processing


    【解决方案1】:

    确实如此,并且有很多方法,例如..

    SELECT
      *, 
      SUM(CASE WHEN zone = 'WAREHOUSE' THEN 1 ELSE 0 END)
        OVER(ORDER BY id) as tripId 
    FROM t
    

    您将获得一列,其中的数字仅在遇到 WAREHOUSE 时才会增加。在使用 WITH 将其转换为子查询或 CTE 之后,使用标准 group by 进行分组和平均非常容易。如果您也想保留详细信息的行,请使用例如 AVG(stop_duration) OVER(PARTITION BY tripId)

    如果您使用的数据库不支持窗口函数,您可以通过从仓库行中获取最大 id 来实现类似的效果,即小于或等于当前行的 id

    SELECT *,
      (SELECT MAX(id) FROM t sub WHERE sub.id <= main.id AND zone = 'WAREHOUSE') 
    FROM t main
    

    该列将像 1,1,1,1,5,5,5,5 但对于您需要它会很好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多