我想到了这个问题,因为我刚刚发现了这个网站,所以决定将其发布在这里。
假设我有一个带有时间戳和状态的表,用于给定的“对象”(一般含义,而不是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(如果不是通用的话)
这是使用分析函数的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
这些通常在传统上我们可能使用自联接的情况下使用。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。