如何解决基于几种特定模式对数据进行分组的 SQL 查询?
假设我有一张这样的桌子:
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 查询来做到这一点?如果不是,我需要使用什么样的工具?
解决方法
确实如此,而且有很多方法,例如..
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,5,5 一样,但对于您需要的内容,它会很好
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。