这个问题我玩过几次了。
这实际上是关于嵌套两个查询以到达那里:
第一个查询(使用公用表表达式)引入了一个计数器,当您所追求的条件为真时为 1,否则为 0。
第二个查询,查询第一个查询的输出,创建该计数器的运行总和。
它比我在 BigQuery 版本下方显示的 Vertica 版本笨拙得多...
让我使用我玩过的示例:带有时间戳和油压测量的传感器数据。我们想将我们只能识别的“行程”分开,因为“行程”之间有超过 30 分钟的间隔。
BigQuery 版本 - 它适用于所有支持 LAG() OLAP 函数的 DBMS-s ...
WITH
-- input ...
oilpressure(vid,ts,psi) AS (
SELECT 42,TIMESTAMP '2020-10-01 17:00:00', 25.356
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:00:10', 35.124
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:00:20', 47.056
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:00:30', 45.225
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:00', 25.356
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:10', 35.124
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:20', 47.056
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:30', 45.225
)
,
with_chg_counter AS (
SELECT
CASE WHEN ts - LAG(ts,1,'0000-01-01') OVER w > '30 MINUTES'
THEN 1
ELSE 0
END AS chg
, *
FROM oilpressure
WINDOW w AS (PARTITION BY vid ORDER BY ts)
)
SELECT
vid
, SUM(chg) OVER w AS tripid
, ts
, psi
FROM with_chg_counter
WINDOW w AS (PARTITION BY vid ORDER BY ts)
;
-- out vid|tripid|ts |psi
-- out 42| 1|2020-10-01 17:00:00|25.356
-- out 42| 1|2020-10-01 17:00:10|35.124
-- out 42| 1|2020-10-01 17:00:20|47.056
-- out 42| 1|2020-10-01 17:00:30|45.225
-- out 42| 2|2020-10-01 17:45:00|25.356
-- out 42| 2|2020-10-01 17:45:10|35.124
-- out 42| 2|2020-10-01 17:45:20|47.056
-- out 42| 2|2020-10-01 17:45:30|45.225
还有 Vertica 版本...
WITH
oilpressure(vid,ts,psi) AS (
SELECT 42,TIMESTAMP '2020-10-01 17:00:00', 25.356
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:00:10', 35.124
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:00:20', 47.056
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:00:30', 45.225
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:00', 25.356
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:10', 35.124
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:20', 47.056
UNION ALL SELECT 42,TIMESTAMP '2020-10-01 17:45:30', 45.225
)
SELECT
vid
, CONDITIONAL_TRUE_EVENT(
ts - LAG(ts,1,'0000-01-01') > '30 MINUTES'
) OVER w AS tripid
, ts
, psi
FROM oilpressure
WINDOW w AS (PARTITION BY vid ORDER BY ts)
;
-- out vid | tripid | ts | psi
-- out -----+--------+---------------------+--------
-- out 42 | 1 | 2020-10-01 17:00:00 | 25.356
-- out 42 | 1 | 2020-10-01 17:00:10 | 35.124
-- out 42 | 1 | 2020-10-01 17:00:20 | 47.056
-- out 42 | 1 | 2020-10-01 17:00:30 | 45.225
-- out 42 | 2 | 2020-10-01 17:45:00 | 25.356
-- out 42 | 2 | 2020-10-01 17:45:10 | 35.124
-- out 42 | 2 | 2020-10-01 17:45:20 | 47.056
-- out 42 | 2 | 2020-10-01 17:45:30 | 45.225