SQL 查询基于几个特定模式的数据分组?

SQL Query For Grouping Data Based On Several Particular Pattern?

假设我有这样一个 table:

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 行之前。

因此对于 table,一个行程由 ID 为 1、2、3 和 4 的行组成。另一个行程由 ID 为 5、6、7 和 8 的行组成.

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

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

是的,而且有很多方法,例如..

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

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

如果您使用的数据库不支持 window 函数,您可以通过询问仓库行的最大 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 一样,但对于您所需要的,它会很好