如何获取数据库中每个日期到目前为止最大日期的数据

时间:2016-09-22 22:59:28

标签: mysql database

我有一个数据库,可以跟踪某个进程的状态,即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 然后将为表格添加具有新日期和新状态的新条目,以便将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的更改数据,而不考虑以前日期的未更改数据,因为知道更新每天发生且条目/日可能很少,因此重复使用新日期的数据将是巨大且低效的< / p>

任何帮助?

1 个答案:

答案 0 :(得分: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置于其更改的那一天,新行的开始将等于前一天的结束日。

当前记录始终具有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