2017-07-26 22 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