5

他のメタデータに加えて、開始時刻と終了時刻の列を含む、作業単位を表す行を含む大規模なOracleテーブルがあります。

いくつかの任意のフィルタリング基準とレポート期間を前提として、このデータから使用状況グラフを生成する必要があります。たとえば、先週の火曜日の午前7時から始まる24時間のアリスのすべての仕事のグラフを見せてください。各DB行は、グラフ内で垂直方向にスタックされます。

これは、関連する可能性のあるすべての行をクエリし、各行を1分のバケットにタイムスライスし、結果をグラフ化することで、高級言語で行うことができます。しかし、SQLで今回のスライスを行う効率的な方法はありますか?または、これを行う既存のOracleテクノロジーはありますか?

ありがとう!

4

3 に答える 3

5

データの取り出しに関しては、「group by」と「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 が 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 日の 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 に答える