簡體   English   中英

如何獲取數據庫中每個日期到目前為止最大日期的數據

[英]how to get for each date in the database the data of max date so far

我有一個數據庫,可以跟蹤某個進程的狀態,即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,那么新的日期和新狀態的新條目將被添加到表中,因此數據庫的最終條目如下所示

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的更改數據,而不考慮以前日期的未更改數據,因為知道更新每天發生且條目/日可能很少,因此重復數據與新日期將是巨大且低效的

任何幫助?

您應該修改表以具有開始/結束日期,並且僅在發生更改時插入新行。 例:

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置於其更改的那一天,新行的開始將等於前一天的結束日。

當前記錄始終具有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM