在Oracle / SQL中进行时间切片

时间:2008-12-18 22:30:02

标签: sql oracle optimization reporting graphing

我有一个包含代表工作单位的行的大型Oracle表,除了其他元数据外还有开始时间和结束时间的列。

我需要根据这些数据生成使用图,给出一些任意过滤条件和报告时间段。例如,向我展示上周二上午7点开始的24小时内所有Alice工作的图表。每个DB行将在图中垂直堆叠。

我可以通过查询所有可能相关的行,将每个行切成1分钟的时间段并绘制结果图表,以高级语言执行此操作。但是有没有一种有效的方法来在SQL中进行切片?或者是否有现成的Oracle技术可以做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:5)

在获取数据方面,您可以使用“分组依据”和“truncate”将数据分成1分钟的间隔。例如:

SELECT user_name, truncate(event_time, 'YYYYMMDD HH24MI'), count(*)
FROM job_table
WHERE event_time > TO_DATE( some start date time)
AND user_name IN ( list of users to query )
GROUP BY user_name, truncate(event_time, 'YYYYMMDD HH24MI') 

这将给出如下结果(假设alice有20行,在8.00和8.01之间,40行在8.01和8.02之间):

Alice  2008-12-16 08:00   20
Alice  2008-12-16 08:01   40

答案 1 :(得分:0)

你最好的选择是拥有一张表(如果时间片是动态的,那么即时生成的临时表就可以了)然后再加入其中。

答案 2 :(得分:0)

这应该做得相当好。它将分解为分钟(一天的1/1440)。

SELECT 
  to_char(Times.time,'hh24:mi'),
  count(*)   
FROM   
  (SELECT
     time
   FROM  
     dual
   WHERE 
     1=2 
   MODEL 
     dimension by ( 0 as key )
     measures     ( sysdate -1 as time )
     rules upsert ( time[ for key from 0 to 1 increment (1/1440) ] = sysdate-1 + cv(key)) ) Times,
  job_table
WHERE 
  begintime <= Times.time 
AND 
  endtime > Times.time 
AND
  user_name = 'Alice'
GROUP BY 
  Times.time 
ORDER BY
  Times.time

我确信有更快的方法可以做到这一点,但这是我能想到的最好方法。 希望这会有所帮助。