首页 > 解决方案 > Oracle,将持续时间多行拆分为一小时

问题描述

我知道这个问题在这里得到了回答:

Oracle,将持续时间行拆分为一小时

但是,如果您有多个这样的时间段怎么办: 在此处输入图像描述

我有以下查询:

select AdmitDate, PatientName, Room, greatest(start_time, trunc(start_time+(level-1)/24, 'hh24')) beginTime, least(end_time, trunc(start_time+(level)/24, 'hh24')) endTime
from Utilization
connect by level <= floor((trunc(end_time, 'hh')-trunc(start_time, 'hh'))*24)+1 

但它返回下面似乎不正确的结果。 在此处输入图像描述

如果我有一个单一的时间行表,它会很好用。

有没有办法可以按 PatientName 或仅单独计算的每一行对结果进行分组?

标签: sqloracle

解决方案


你真的很亲近。添加一个 DISTINCT 和一个 ORDER BY,我认为你已经得到了你正在寻找的结果:

SELECT DISTINCT AdmitDate,
                PatientName,
                Room,
                greatest(start_time, trunc(start_time+(level-1)/24, 'hh24')) beginTime,
                least(end_time, trunc(start_time+(level)/24, 'hh24')) endTime
  from Utilization
  connect by level <= floor((trunc(end_time, 'hh')-trunc(start_time, 'hh'))*24)+1
  ORDER BY 1, 2, 3, 4, 5

这会产生:

ADMITDATE               PATIENTNAME ROOM BEGINTIME              ENDTIME
2012-01-24 00:00:00     Patient1    RM1  2012-01-24 07:30:00    2012-01-24 08:00:00
2012-01-24 00:00:00     Patient1    RM1  2012-01-24 08:00:00    2012-01-24 08:32:00
2012-01-24 00:00:00     Patient2    RM1  2012-01-24 08:45:00    2012-01-24 09:00:00
2012-01-24 00:00:00     Patient2    RM1  2012-01-24 09:00:00    2012-01-24 09:13:00

SQLFiddle在这里


推荐阅读