1

時間範囲にわたるアクティビティを提供するselectステートメントがあります。例えば

Hour | Action | Count
---------------------
 00  | a1     | 23
 00  | a2     | 48
 01  | a1     | 16
 02  | null   | null
 03  | a1     | 5
 04  | a2     | 2

この結果を生成するグループ化のおかげで、時間01、アクション02などのカウントがないことがわかります。私が欲しいのは次のとおりです。

Hour | Action | Count
---------------------
 00  | a1     | 23
 00  | a2     | 48
 01  | a1     | 16
 01  | a2     | 0
 02  | a1     | 0
 02  | a2     | 0
 03  | a1     | 5
 03  | a2     | 0
 04  | a1     | 0
 04  | a2     | 2

そのために、行Actionの個別の値を決定することを考えていたので、これを同じテーブルに左結合しました。これは、SQLコードでは次のようになります。

select distinct(t2.action) as action 
from t2 as t1 
left join (select hour, action, count from <whatever to get the table>) as t2 
  on t1.action = t2.action

しかし、そうすると、当然のことながら、テーブルt2がt1のselectステートメント内で無効であるというエラーが発生します。

これを行うためのアドバイスを教えてください。しかし、私は元のテーブルで区別したくありません(5000万のエントリがあります)。

前もって感謝します!

4

2 に答える 2

2

外部結合 + パーティション句を使用できます。

select hours.hour, t2.action, nvl(t2.count, 0)
  from (select distinct hour from t2) hours
       left outer join (select * from t2) t2
       partition by (t2.action)
                    on hours.hour = t2.hour
 where t2.action is not null
 order by hour, action;

または、行がテーブル/ビューにあるかどうかに関係なく、0 から 23 の時間を生成したい場合:

with hours as (select to_char(rownum-1, 'fm00') r from dual connect by level <= 24)
select hours.r, t2.action, nvl(t2.count, 0)
  from hours
       left outer join (select * from t2) t2
       partition by (t2.action)
                    on hours.r = t2.hour
 where t2.action is not null
 order by r, action;

フィドル: http://sqlfiddle.com/#!4/27a40/1

于 2013-03-08T15:58:12.397 に答える
1

内部クエリでgroupbyを追加し、distinctの周りの()を削除する必要があります。これは私にとってはうまくいきます-カウントなしのクエリと同様です:

SELECT distinct rm.user_id as user_id  -- rm.user_id comes from inner query
  FROM Readings r 
 LEFT JOIN  
 (
  SELECT r2.user_id, r2.reading_time, r2.x, r2.y
  FROM Readings r2
  ) rm   
 ON rm.user_id=r.user_id 
/
于 2013-03-08T15:48:25.610 に答える