sql - 根据值的时间序列对表中的值进行排名

标签 sql sql-server

我有一张与此类似的表,代表哪些司机在特定时间驾驶不同的汽车。

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/

相关文章:

c# - 如何将值从存储过程返回到 EF

sql-server - 表锁定建议

Sql Server 2008 嵌套 View

php - MySQL 插入或替换

sql-server - 是否可以将 SQL Server session 上下文与 Azure 弹性查询一起使用

php - 从 MySQL 数据库的所有表中检索最近添加的 25 个条目

c# - 在 C# 中使用 "%"运算符的 sql 删除查询

sql-server - 尝试在 SQL 中为购物篮创建存储过程

sql - postgresql - 选择 4 列,其中 1 列需要过滤

MYSQL子集操作