2017-07-26 4 views
0

私は次のイベントテーブルを持っており、各ID、EventDay、EventWeekごとにEventStatus (High>Low>Normal)については、最も重篤/と報告されています。ソリューションは、複数のイベント週間とイベントの日に対処する必要があるだろう1日と1週間に定義された階層を持つイベントタイプを要約する方法(SQLまたはETLを使用)

たとえばMySQLやMariaDB互換性のあるSQLまたは を用いて達成することができる何かがETLプロセスは、(ステップの概要で)タスクに適しだろうということです?

SampleTableを

ID EventStatus EventDay EventWeek 
1 Normal  1   1 
1 Low   2   1 
1 High  2   1 
1 Normal  2   1 
2 Normal  1   1 
2 Normal  2   1 
3 Normal  2   1 
3 Low   2   1 

所望の出力

ID EventStatus EventDay EventWeek 
1 Normal  1   1 
1 High  2   1 
2 Normal  1   1 
2 Normal  2   1 
3 Low   2   1 

ソリューションはEventDayとEventWeek

+0

あなたのテーブルの行数とそれが成長する可能性があることは分かりますか?あなたのデータが比較的小さい場合は、MySQLでVIEWを作成することができます。 – WJS

+0

その20,0000行と私はそれが毎回数百行だけ増加すると期待しています – mobcdi

+0

これはSQLのための簡単な作業です。 (少なくとも、MySQLに関してはVIEWを作成することでここで利益が得られません。 – Strawberry

答えて

1
に加えて、イベント(EventLocation)を拘束するために追加の列に対処するだろう

ここに一つのアイデアがあります。 (id、eventweek、eventday)のインデックスが役に立ちます。優先度(H、L、N)をinterger(例えばそれぞれ3,2,1)として保存することができれば、この値をインデックスに追加することができます。これによりさらにパフォーマンスが向上しますが、おそらく他の方法もあります...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(ID INT NOT NULL 
,EventStatus VARCHAR(12) NOT NULL 
,EventDay INT NOT NULL 
,EventWeek INT NOT NULL 
,PRIMARY KEY(ID,EventWeek,EventDay,EventStatus) 
); 

INSERT INTO my_table VALUES 
(1,'Normal',1,1), 
(1,'Low',2,1), 
(1,'High',2,1), 
(1,'Normal',2,1), 
(2,'Normal',1,1), 
(2,'Normal',2,1), 
(3,'Normal',2,1), 
(3,'Low',2,1); 

SELECT a.* 
    FROM my_table a 
    JOIN 
    (
     SELECT id 
      , MAX(CASE eventstatus WHEN 'High' THEN 3 WHEN 'Low' THEN 2 ELSE 1 END) eventstatus 
      , eventday 
      , eventweek 
     FROM my_table 
     GROUP 
      BY id 
      , eventweek 
      , eventday 
    ) b 
    ON b.id = a.id 
    AND b.eventstatus = CASE a.eventstatus WHEN 'High' THEN 3 WHEN 'Low' THEN 2 ELSE 1 END 
    AND b.eventweek = a.eventweek 
    AND b.eventday = a.eventday; 

+----+-------------+----------+-----------+ 
| ID | EventStatus | EventDay | EventWeek | 
+----+-------------+----------+-----------+ 
| 1 | Normal  |  1 |   1 | 
| 1 | High  |  2 |   1 | 
| 2 | Normal  |  1 |   1 | 
| 2 | Normal  |  2 |   1 | 
| 3 | Low   |  2 |   1 | 
+----+-------------+----------+-----------+ 
+0

'CASE'と' MAX'を使ってうまく解決しました。私はテキスト値の代わりにeventstatus整数値を使います。どのようなエラー私は何を作っているすべてのアイデア? – mobcdi

+0

@mobcdi上記のコードをコピーしている場合は、いいえ。いい考えはありません。 – Strawberry

+0

2番目のcase文 'AND b.eventstatus = CASE a.eventstatus 'の必要性を理解するのに問題があります。' High 'THEN 3' Low 'THEN 2 ELSE 1 END'コードを説明できますか。あなたはID をSELECT '使用している場合、サブクエリがあなたに結果を得ることはありません、MAX(CASEのeventstatus '高' THEN 3は、WHEN '低' THEN ELSE 2 1 END)、eventstatus 、eventday 、MY_TABLE FROM eventweek GROUP BY ID 、eventweek 、eventdayは ' – mobcdi

関連する問題