2017-07-26 49 views
0

如果我有以下事件表,並且我想總結一下,那麼對於每個ID,EventDay,EventWeek,我會得到1行,如EventStatus被報告爲最嚴重/涉及(High>Low>Normal)。該解決方案將需要處理更多的事件周活動的日子如何總結每天和每週定義的層次結構的事件類型(使用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 

請問溶液應付附加列來約束除的事件(EventLocation)至EventDay和EventWeek

+0

你知道你的表有多少行以及它可能增長的數量?如果你的數據相對較小,在MySQL中創建一個VIEW將會起作用。 – WJS

+0

目前它的20,0000行和我預計它每次只會增加幾百行更新 – mobcdi

+0

這對於SQL來說是一項簡單的任務。 (至少就MySQL而言)創建一個VIEW在這裏沒有任何好處。 – Strawberry

回答

1

這是一個想法。 (id,eventweek,eventday)上的索引將有所幫助。如果你可以存儲優先級(H,L,N)作爲整數(例如分別爲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

我無法理解第二個case語句的需求'AND b.eventstatus = CASE a.eventstatus WHEN'HIGH'THEN 3 WHEN'LOW'THEN 2 ELSE 1 END'你能解釋一下代碼嗎?不子查詢讓你的結果,如果你用'選擇ID ,MAX(CASE eventstatus如果 '高',那麼3當 '低',那麼2 ELSE 1 END),eventstatus ,eventday ,eventweek FROM MY_TABLE GROUP BY ID ,eventweek ,eventday' – mobcdi