0

eventdatetime 、 userid などのテーブルがあります。データは毎日テーブルに挿入されます。

report の場合、週ごとにグループ化された userid と projectid の数を指定する必要があります。

データを週ごと、月ごとにグループ化するのに助けが必要です。オラクルを使用しています。

select count(distinct( table1.projectid))as Projects, count(distinct( table2.userid)) as Users,?? 
from table1
join table 2
on table1.a= table2.a
where table1.e='1'
and  table1.eventdatetime between sysdate-30 and sysdate-1  

??でグループ化

出力を次のように週ごとにグループ化したい: WeekBegin 2013-04-14

2013-04-21

4

2 に答える 2

0

http://www.techonthenet.com/oracle/functions/to_char.phpTo_Char関数を 使用しIWて週を取得します。GROUP BY次に、その値を指定できIWます。

Oracle の週の開始日は、データベースの言語設定に依存することに注意してください。日曜日に始まる国もあれば、月曜日に始まる国もあります。確認するには、設定を確認する必要があります。すでに日曜日に開始されている場合は、幸運です。

于 2013-06-04T20:56:26.117 に答える
0

投稿した例が進行中のバージョンである場合-曜日を取得することを心配する前に、クエリの基本を正しく確認する必要があります

e.projectid と u.userid を選択していますが、クエリに e または u という名前のテーブルがありません。これらを e および u としてエイリアスしたいようです。

クエリの where 句は、存在しないテーブル e も探しています

その場合は変更する必要があります

from table1 
join table2
on table1.a= table2.a

from table1 e        -- select from table1 using alias e
  join table2 u      -- join table2 using alias u
    on ( e.a = u.a ) -- joining on column a from table1 (e) = a from table2 (u)

on セクションの a を結合したい列名に置き換えたら、最後の列 ", ??" を削除した後に実行される可能性があります。選択から - おそらくこれらの線に沿った何か

select
  count (e.projectid) PROJECTS,
  count (u.userid) USERS

from table1 e
  join table2 u
    on ( e.a = u.a )

where e.FILTERING_COLUMN = '1'
  and e.eventdatetime >= sysdate-30

sysdate はサーバーの現在の時刻であるため (ローカリゼーションとセッションの設定によって異なります)、sysdate-30 よりも大きい値を使用することができます。テーブルが適切にインデックス化されている場合、クエリ オプティマイザーに簡単な時間を与えることができます。

グループ化の基本的なルールは、列を選択するには、それによってグループ化するか、COUNT() などの集計関数を使用する必要があるということです。

したがって、おそらく次のようなものが必要になるでしょう

select
  count (e.projectid) PROJECTS,
  count (u.userid) USERS,
  to_char(e.eventdatetime,'MM') MONTH

from table1 e
  join table2 u
    on ( e.a = u.a )

where e.FILTERING_COLUMN = '1'
  and e.eventdatetime >= sysdate-30

group by e.eventdatetime

これはこれを行うための最適な方法ではありませんが、問題に関連するスキーマを投稿すると簡単になります。

于 2013-06-04T21:08:16.960 に答える