2016-09-22 21 views
1

我有跟踪某一过程的每当天的状态要么是F,S,或P如何获取数据库中的每个日期最多日期的数据,到目前为止

数据库该过程的状态可以改变或保持原样,但只有一个新的条目将被添加到该数据的基础上,如果状态例如改变 的DB最初包含4个如下:

process_id state Day 
p1    f  23/9 
p2    f  23/9 
p3    p  23/9 
p4    s  23/9 

,并且如果上第二天,p2的状态从f变为p ,然后用新的日期和新的sta土族将为P2被添加到表,所以数据库的最终报名情况如下

process_id state  Day 
p1    f  23/9 
p2    f  23/9 
p3    p  23/9 
p4    s  23/9 
p2    p  24/9 

什么,我需要做的是让每个国家的数量每天如下

#f  #s #p  Day 
2  1  1  23/9 
1  1  2  24/9 

我怎么能做到这一点,而不必继续重复条目的新日期为不变的过程

,如果我这样做

select count(process_id) from my_table group by state,Day 

这将只计算24/9上更改的数据,不考虑以前的日期未改变的数据,因为知道更新每天发生并且条目/日期可能会很少,所以新数据的重复数据将是巨大且低效的

有帮助吗?

回答

0

你应该修改你的表有一个开始/结束日期,并且只有在有改变时插入新的行。例如:

process_id state  SDay  EDay 
p1    f  23/9  NULL 
p2    f  23/9  24/9 
p3    p  23/9  NULL 
p4    s  23/9  NULL 
p2    p  24/9  NULL 

在23/9,你的P2从f变成p。所以,在EDAY改变的那天放入EDAY,新行的开始将等于上一天的结束日期。

当前记录始终有一个NULL结束日期。如果你愿意,你也可以使用未来的日期而不是NULL。如:1/1/2500。这样一来,任何时候你想要的只是目前的记录,你可以说,

SELECT * FROM my_table WHERE Date BETWEEN SDay AND EDay 

对于您的要求第二部分:

“我需要做的是让每一个国家的每一个计数一天“

我会建议某种日期维度表。如:

Date 
23/5 
23/6 
23/7 
23/8 
24/9 
... 

然后,您可以:

SELECT count(process_id), state, Date 
FROM DateTable 
INNER JOIN my_table 
    ON Date BETWEEN SDay AND IFNULL(EDay, '1/1/2500') 
GROUP BY state, Date 
+1

完美!谢谢:D –

相关问题