SELECT 工程号, 开始日期, 结束日期 FROM (SELECT pro_id AS 工程号, pro_start AS 开始日期, pro_end AS 结束日期, LEAD (pro_start) OVER (ORDERBY pro_id) 下一工程开始日期 FROM v) WHERE 下一工程开始日期 = 结束日期
SELECT log_name AS 登录名, log_time AS 登录时间, LEAD (log_time) OVER (PARTITIONBY log_name ORDERBY log_time) 下一登录时间 FROM v;
计算用户两次登录的时间间隔
SELECT log_name AS 登录名, log_time AS 登录时间, (下一登录时间 - 登录时间) * 24 * 60AS 登录间隔 FROM (SELECT log_name AS 登录名, log_time AS 登录时间, LEAD (log_time) OVER (PARTITIONBY log_name ORDERBY log_time) 下一登录时间 FROM v);
CREATEORREPLACEVIEW x0 AS SELECT pro_id AS 编号, pro_start AS 开始日期, pro_end AS 结束日期, LAG (pro_end) OVER (ORDERBY pro_id) AS 上一工程结束日期 FROM v; SELECT * FROM x0;
标定项目的连续状态
CREATEORREPLACEVIEW x1 AS SELECT 编号, 开始日期, 结束日期, 上一工程结束日期, CASEWHEN 开始日期 = 上一工程结束日期 THEN0ELSE1ENDAS 连续状态 FROM x0; SELECT * FROM x1;
从结果图看出,每个连续分组的开始,都生成了一个“1”的标识。
对位置状态进行累加,得到分组依据
CREATEORREPLACEVIEW x2 AS SELECT 编号, 开始日期, 结束日期, 上一工程结束日期, 连续状态, SUM(连续状态) over(ORDERBY 编号) AS 分组依据 FROM x1; SELECT * FROM x2;
可以看到,通过提取数据、生成标识、累加标识这些操作后,得到了需要的 3 个连续分组。
得到分组信息
SELECT 分组依据, MIN (开始日期) AS 开始日期, MAX (结束日期) AS 结束日期 FROM x2 GROUPBY 分组依据 ORDERBY1;