我有一张与此类似的表,代表哪些司机在特定时间驾驶不同的汽车。
CAR_ID DRIVER_ID DT
10 A 10:00
10 A 12:00
10 A 14:00
10 B 16:00
10 B 17:00
10 B 20:00
10 A 21:00
10 A 22:00
20 C 15:00
20 C 18:00
哪里DT
是一个日期时间。我正在尝试获得与使用 DENSE_RANK()
获得的类似的东西函数,但当列 DRIVER_ID
发生变化时生成一个新数字两个司机之间。这将是我的预期输出:
CAR_ID DRIVER_ID DT RES
10 A 10:00 1
10 A 12:00 1
10 A 14:00 1
10 B 16:00 2
10 B 17:00 2
10 B 20:00 2
10 A 21:00 3 #
10 A 22:00 3 #
20 C 15:00 4
20 C 18:00 4
使用DENSE_RANK() OVER (PARTITION BY CAR_ID, DRIVER_ID ORDER BY DT) AS RES
我将两个标有 # 的元素作为与前三行同一组的成员,但我希望它们不同,因为存在“不连续性”(汽车从 16:00 到 20 是由另一位司机驾驶的: 00)。我似乎找不到不包含循环的解决方案。这可能吗?
任何帮助将不胜感激。
最佳答案
这可以通过lag
和运行总和来完成。
select t.*,sum(case when prev_driver = driver then 0 else 1 end) over(partition by id order by dt) as res
from (select t.*,lag(driver_id) over(partition by id order by dt) as prev_driver
from tbl
) t
关于sql - 根据值的时间序列对表中的值进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650380/