2016-09-22 22 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 –

相關問題