从版本控制的审核日志查询每天的状态更新?

时间:2012-09-12 17:02:20

标签: mysql

我目前正在开发一个审核日志,用于跟踪各个项目的版本历史记录,即跟踪实际更改以及标记更改类型(创建,更新或删除)的标记。

现在每个项目还有一个“状态”列,显示该项目的状态(打开,同意,也许)。

必填查询:获取到目前为止每天的商品状态计数。所以输出应该是这样的:

day | status | count
---------------------
 1  |  open  |  3
 2  |  open  |  4
 2  |  maybe |  1
 2  |  agree |  2
 3  |  open  |  2
 3  |  agree |  2

等等。我一直在努力从审计日志表(wc_audit_log)构建此查询,如下图所示。还有其他列,但主要是文本,与此查询无关(恕我直言:)

enter image description here

我尝试过使用group byorder by的各种组合以及year, dayofmonth, month函数,但似乎无法解决如何构建此查询的问题。最棘手的部分是关于版本控制的“日”边界和重复。也就是说,完全可以让项目多次更新,同一天没有任何状态更新,或者在同一天内通过多个状态转换。

因此,在基于状态的重复项的情况下,将选择最新的带时间戳的项目。即如果一个项目被更新两次并且状态为“打开”两次,只需选择最后一个。重复计算是好的,即如果该项目是开放的并且在同一天同意,则可以在两个地方计算。

但是,我仍然无法弄清楚如何构建这样的查询。上面的图片应该只显示那些相关列的表的一部分,但是也应该给出重复项等的概念,这使得我认为这是一个非平凡的查询。

PS:标记为已删除的项目将不予考虑,因此不属于上表。但是,即使该项目已被删除但存在于“过去”

,上述情况仍然适用

3 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求。它计算每天具有任何给定状态的wc_ids的数量。它不会在一天内计算重复数。

select extract(year from timestamp), extract(month from timestamp),
       extract(day from timestamp),
       status, count(distinct wc_id)
from a
group by extract(year from timestamp), extract(month from timestamp),
         extract(day from timestamp), status
order by 1, 2, 3, 4

但是,如果整天都有重复项,则ID会在两天内以相同的状态计算两次。

答案 1 :(得分:1)

我重读了你的描述几次。不只是:

select datediff(now(), timestamp), status, count(distinct wc_id)
from foo
group by 1,2

答案 2 :(得分:1)

你可以试试这个:

SELECT `day`, status, COUNT(wc_id) as `count`
FROM
    (SELECT DATE(timestamp) as `day`, wc_id, status, MAX(timestamp) as `max_time`
    FROM table_name
    GROUP BY `day`, wc_id, status) AS max_timestamp_per_wcid_and_status
GROUP BY `day`, status
ORDER BY `day` ASC, status DESC