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 一样,但对于您所需要的,它会很好
假设我有这样一个 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 一样,但对于您所需要的,它会很好