开发者社区> 问答> 正文

关系数据库中的行程时间计算?

我想到了这个问题,因为我刚刚发现了这个网站,所以决定将其发布在这里。

假设我有一个带有时间戳和状态的表,用于给定的“对象”(一般含义,而不是OOP对象);有没有一种最佳方法,可以使用一条SQL语句(不计算内部SELECT和UNION)来计算一个状态与下一次出现另一个(或相同)状态(我称为“行程”)之间的时间?

例如:对于以下情况,“初始”和“完成”之间的旅行时间为6天,但是“初始”和“审阅”之间的旅行时间为2天。

2008-08-01 13:30:00-初始
2008-08-02 13:30:00-工作
2008-08-03 13:30:00-评论
2008-08-04 13:30:00-工作
2008- 08-05 13:30:00-审核
2008-08-06 13:30:00- 接受
2008-08-07 13:30:00- 完成

无需通用,只需说说您的解决方案针对的SGBD(如果不是通用的话)

展开
收起
心有灵_夕 2019-12-28 23:51:21 1038 0
1 条回答
写回答
取消 提交回答
  • 这是使用分析函数的Oracle方法论。

    with data as (
    SELECT 1 trip_id, to_date('20080801 13:30:00','YYYYMMDD HH24:mi:ss') dt, 'Initial'  step from dual UNION ALL
    SELECT 1 trip_id, to_date('20080802 13:30:00','YYYYMMDD HH24:mi:ss') dt, 'Work'     step from dual  UNION ALL
    SELECT 1 trip_id, to_date('20080803 13:30:00','YYYYMMDD HH24:mi:ss') dt, 'Review'   step from dual  UNION ALL
    SELECT 1 trip_id, to_date('20080804 13:30:00','YYYYMMDD HH24:mi:ss') dt, 'Work'     step from dual UNION ALL
    SELECT 1 trip_id, to_date('20080805 13:30:00','YYYYMMDD HH24:mi:ss') dt, 'Review'   step from dual  UNION ALL
    SELECT 1 trip_id, to_date('20080806 13:30:00','YYYYMMDD HH24:mi:ss') dt, 'Accepted' step from dual  UNION ALL
    SELECT 1 trip_id, to_date('20080807 13:30:00','YYYYMMDD HH24:mi:ss') dt, 'Done'     step from dual )
    select trip_id,
           step,
           dt - lag(dt) over (partition by trip_id order by dt) trip_time
    from  data
    /
    
    
    1   Initial 
    1   Work        1
    1   Review      1
    1   Work        1
    1   Review      1
    1   Accepted    1
    1   Done        1
    
    

    这些通常在传统上我们可能使用自联接的情况下使用。

    2019-12-28 23:51:39
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载