5

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

给定一些任意过滤标准和报告时间段,我需要从这些数据中生成使用图。例如,给我看一张爱丽丝在上周二早上 7:00 开始的 24 小时内所有工作的图表。每个 DB 行将在图中垂直堆叠。

我可以通过查询所有可能相关的行、将每行时间切片到 1 分钟的存储桶中并绘制结果来用高级语言来做到这一点。但是有没有一种有效的方法可以在 SQL 中进行时间切片?或者是否有现有的 Oracle 技术可以做到这一点?

谢谢!

4

3 回答 3

5

在获取数据方面,您可以使用“分组依据”和“截断”将数据分成 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') 

这将为您提供如下结果(假设爱丽丝在 8.00 和 8.01 之间有 20 行,在 8.01 和 8.02 之间有 40 行):

Alice  2008-12-16 08:00   20
Alice  2008-12-16 08:01   40
于 2008-12-19T09:05:52.690 回答
0

你最好的选择是有一个表(如果时间片是动态的,一个临时生成的就可以了),然后加入反对它。

于 2008-12-18T22:50:10.093 回答
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

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

于 2009-01-09T22:23:34.807 回答