如何在一段时间内迭代select语句

时间:2015-09-23 15:37:32

标签: sql oracle

我需要在一段时间内迭代一个select语句。目的是通过使用记录的打开和关闭时间戳,在过去一年中的每一天的某个时刻获得我们各组中的开放记录的数量。 select语句是这样的:

select I.INC_GROUP, count(I.INC_GROUP) as INC_VOLUME
from XXX.INCIDENT i
where
I.OPEN_TIME < to_date('2015/09/21 08:00:00', 'YYYY/MM/DD HH24:MI:SS') and
I.CLOSE_TIME > to_date('2015/09/21 08:00:00', 'YYYY/MM/DD HH24:MI:SS')
group by I.INC_GROUP

我正在尝试今天上午8点迭代它 - 今天366到8AM-1。我的输出将插入到表中,并包含INC_GROUP,INC_VOLUME和迭代日期(第一条记录为22-SEP-14 08:00:00)。

1 个答案:

答案 0 :(得分:2)

使用CONNECT BY生成一组数字,并将这些数字与日期逻辑结合使用(DATE + 1将添加一天)。这将为您每天生成一行。

SELECT TRUNC(SYSDATE - LEVEL) + (1/24*8)
FROM dual
CONNECT BY LEVEL <= 365

然后可以将其合并到另一个数据集中,例如:

WITH days AS (
  SELECT
    TRUNC(SYSDATE - LEVEL) + (1/24*8) day_start
  -- This adds a day to the above and removes a second
  , TRUNC(SYSDATE - LEVEL + 1) + (1/24*8) - (1/24/60/60) day_end    
  FROM dual
  CONNECT BY LEVEL <= 365
)
SELECT 
  days.day_start
, COUNT(yt.date_col) num
FROM days
LEFT JOIN your_table yt ON yt.date_col BETWEEN days.day_start AND days.day_end

这会为您提供每天一行以及来自your_table的多个匹配行,这些行在第二天上午8点到下午7:59:59之间。