2017-04-10 2 views
0

同様の検索を試みましたが、問題を正確に特定できませんでした。現在、特定のサイトの平均温度データを保持していること、私はコラム「SITE」、「DAY」、「TIME」と、のTEST_DATAそれを呼びましょう、テーブルを持っており、「温度」のOracle 11gで存在しない場合でも1時間ごとにデータを返すクエリを実行する必要があります。

作業

特定の日時に実行され、毎日の1時間ごとのデータは含まれません。

TESTデータ:現時点では、のは、私はこれだけのデータを持っているとしましょう、私は、毎日のために結果セットを返すビューまたはクエリを構築することです必要なもの

そして毎時間、それはと同様の結果を返しますTEST_DATAテーブル(その場合には0を返す)、にない場合でも:

SITE | DAY | TIME | TEMPERATURE 
Home | 1 | 0 |   0 
Home | 1 | 1 |   0 
Home | 1 | 2 |   0 
Home | 1 | 3 |   15 
Home | 1 | 4 |   0 
Home | 1 | 5 |   23 
Home | 1 | 6 |   0 
Home | 1 | 7 |   0 
Home | 1 | 8 |   0 
Home | 1 | 9 |   0 
Home | 1 | 10 |   0 
... | ... | ... |   ... 

誰もが、私はこの使用してSQLをやって行く可能性がどのように任意のアイデアを持っていますか?

私は、24 * 31のエントリと曜日/時間の列を持つテーブルを試してみましたが、各曜日/時間のペアの行を作成しましたが、私が望むようにこれを得る方法を考え出していません。

私は、100万行以上の長さのテーブルを作成する2000以上の異なるサイトで作業しているので、この可能性のあるサイトごとにその行が多いこの最終テーブルを作成しないようにします。

私は問題について助けていただきありがとうございます。

EDIT:@Gordon Linoffの答えに おかげで、私は私のテーブルに適応することができたと私はそれを望んでいたとおりの結果を得ました。 31.値をもたらすことleft joinを使用し、その後、すべての行を生成し、 TEST_DAY_TIME

答えて

0

に、

SELECT s.SITE, d.DAY, d.TIME, td.TEMPERATURE 
FROM (SELECT DISTINCT SITE FROM TEST_DATA) s CROSS JOIN 
    (SELECT * FROM TEST_DAY_TIME) d LEFT JOIN 
    TEST_DATA td 
ON td.SITE = s.SITE AND td.DAY = d.DAY AND td.TIME = d.TIME 
ORDER BY d.DAY, d.TIME; 

他のテーブルには、このようなものだったすべての方法を:クエリはされてしまいました。

曜日と時刻の組み合わせが元の表に複数回表示される場合は、もちろん重複して表示されます。

+0

私が言及した他のテーブルを使用することによって、744日/時間のペアがクロスとして最初のテーブルと結合するため、クエリを少し簡素化でき、完全に機能しました。迅速な答えをありがとう、私はあなたのアプローチに行くことを終えて以来、私は答えとしてあなたの返信をマークされます。 –

0

空の時間の基礎を持つように、時間データを作成してからデータに外部結合する必要があります。

これは、以下のようにconnect byを簡単に使用して行うことができます。これは、開始日として1/1/17を使用し、次の100日間1時間増分を与えます。

select to_date('01-jan-17','dd-mon-yy') + numtodsinterval(level,'HOUR') as date_by_hour 
    from dual 
    connect by level <= 24*100; 
あなたはその後、外側を介して一緒にあなたのデータとこのデータを置くことができ

は次のように参加 ...

WITH time_data as 
    (select to_date('01-jan-17','dd-mon-yy') + numtodsinterval(level,'HOUR') as date_by_hour 
    from dual 
    connect by level <= 24*100), 
    test_data(site, day, time, temp) as 
    (select 'HOME', 1, 3, 50 from dual union all 
    select 'HOME', 1, 4, 51 from dual union all 
    select 'HOME', 1, 7, 55 from dual union all 
    select 'HOME', 1, 12, 60 from dual) 
select NVL(test_data.site,'HOME') as site, time_data.date_by_hour, NVL(test_data.temp,0) as temp 
    from time_data 
    left outer join test_data on (time_data.date_by_hour = 
         to_date('01-jan-17','dd-mon-yy')+numtodsinterval(test_data.day-1,'DAY')+numtodsinterval(test_data.time,'HOUR') 
        AND test_data.site = 'HOME')      
order by time_data.date_by_hour; 

もう一点、私はあなたのようにあなたの日付/時刻データを保存することを示唆しています単に日の数字と時間の数字ではなく、日付です。

+0

ありがとうございます。実際のプロダクションテーブルは日付として設定されています。私はちょうど簡単な数字としてテスト1を設定して、日付機能付きの問題を複雑にすることなく素早く試してみます。しかし、アドバイスをいただきありがとうございます。 –

関連する問題