0

我目前正在编写一个审计日志,以跟踪各种项目的版本历史记录,即跟踪实际更改以及说明更改类型(创建、更新或删除)的标记。

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

必填查询:获取到现在每天的物品状态计数。所以输出应该是这样的:

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

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

在此处输入图像描述

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

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

但是,我仍然无法弄清楚如何构建这样的查询。上面的图像应该只显示表的一部分,这些列是相关的,但也应该给出重复项等的想法。在我看来,这是一个不平凡的查询。

PS:标记为已删除的项目将不被考虑,因此不属于上表的一部分。但是,即使该项目已被删除但“过去”存在,上述情况仍然适用

4

3 回答 3

1

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

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 在两天内以相同的状态计算两次。

于 2012-09-12T17:10:37.410 回答
1

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

select datediff(now(), timestamp), status, count(distinct wc_id)
from foo
group by 1,2
于 2012-09-12T17:14:23.023 回答
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
于 2012-09-12T17:14:26.080 回答