2


フィールドuser_name、user_idを持つ「users」テーブルがあります

次のようなデータテーブルがあります

data_table_2012_10
data_table_2012_11
data_table_2012_12
data_table_2013_01
data_table_2013_02

各テーブルには次のフィールドが含まれます

user_id, type ('ALARM', 'EMERGENCY', 'ALIVE', 'DEAD'), date_time

各テーブルには数百万のレコードがあります。

ユーザーが指定した時間内に data_tables からタイプの数を選択する必要があり、user_id を使用して対応するユーザー名を取得する必要があります。

誰かが最善の解決策を手伝ってくれますか。

4

2 に答える 2

1

DATE1 と DATE2 が日付範囲であるこのクエリを試してください。内部クエリですべてのテーブルを結合する必要があります。また、クエリを動的に作成して、使用する日付範囲内のテーブルのみを内部クエリに含めることもできます。

select t.user_id,t.type, MAX(users.user_name), SUM(t.cnt)
from
(
select user_id,type,count(*) cnt
from data_table_2012_10 where date_time between DATE1 and DATE2
group by user_id,type

union all

select user_id,type,count(*) cnt
from data_table_2012_11 where date_time between DATE1 and DATE2
group by user_id,type

union all
.........................................

union all
select user_id,type,count(*) cnt
from data_table_2013_02 where date_time between DATE1 and DATE2
group by user_id,type
) t
left join users on (t.user_id=users.user_id)
group by t.user_id,t.type
于 2013-01-29T07:14:35.733 に答える
0

UNION は使用しないでください。ただし、UNION ALL を使用すると、類似した行を 1 つにマージするだけで、問題が発生する可能性があります。

于 2013-08-19T03:47:45.920 に答える