我目前正在开发一个审核日志,用于跟踪各个项目的版本历史记录,即跟踪实际更改以及标记更改类型(创建,更新或删除)的标记。
现在每个项目还有一个“状态”列,显示该项目的状态(打开,同意,也许)。
必填查询:获取到目前为止每天的商品状态计数。所以输出应该是这样的:
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 by
的各种组合以及year, dayofmonth, month
函数,但似乎无法解决如何构建此查询的问题。最棘手的部分是关于版本控制的“日”边界和重复。也就是说,完全可以让项目多次更新,同一天没有任何状态更新,或者在同一天内通过多个状态转换。
因此,在基于状态的重复项的情况下,将选择最新的带时间戳的项目。即如果一个项目被更新两次并且状态为“打开”两次,只需选择最后一个。重复计算是好的,即如果该项目是开放的并且在同一天同意,则可以在两个地方计算。
但是,我仍然无法弄清楚如何构建这样的查询。上面的图片应该只显示那些相关列的表的一部分,但是也应该给出重复项等的概念,这使得我认为这是一个非平凡的查询。
PS:标记为已删除的项目将不予考虑,因此不属于上表。但是,即使该项目已被删除但存在于“过去”
,上述情况仍然适用答案 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