オラクル/ SQLのタイムスライス
-
22-08-2019 - |
質問
私は他のメタデータに加えて、開始時刻と終了時刻の列と作業単位を表す行を含む大きな風Oracleテーブルを有している。
私はいくつかの任意のフィルタリング基準と報告期間を指定して、このデータから利用グラフを生成する必要があります。例えば、私は午前7:00前火曜日始まる24時間の期間のためのアリスの仕事のすべてのグラフを示しています。各DBの行は、グラフに垂直にスタックされます。
私は時間が1分バケットにそれぞれをスライスし、その結果をグラフ、全ての潜在的に関連する行を照会することによって、高レベルの言語でこれを行うことができました。しかし、SQLでこのタイムスライスを行うための効率的な方法はありますか?それともこれを行い、既存のOracle技術があるのでしょうか?
ありがとうございます。
解決
からデータを取得の面では、」「でグループ」を使用することができ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と8.01と8.02の間に40行の間アリスのための20行がされていると仮定した場合)
Alice 2008-12-16 08:00 20
Alice 2008-12-16 08:01 40
他のヒント
あなたの最善の策は、テーブルを持っている(タイムスライスが動的である場合、その場で生成された一時的なものは大丈夫だろう)と、その反対に参加することです。
これはかなりよくそれを行う必要があります。それは意志分(一日の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
私はこれを行うにはより高速な方法があると確信しているが、これは、私が思い付くことができる最高です。 この情報がお役に立てば幸いです。
所属していません StackOverflow