0

現在、さまざまなアイテムのバージョン履歴を追跡する監査ログに取り組んでいます。つまり、実際の変更を、変更の種類 (作成、更新、または削除) を示すマーカーと共に追跡します。

アイテムには、そのアイテムのステータス (オープン、同意、たぶん) を示す「ステータス」列もあります。

必要なクエリ: 現在までの 1 日あたりのアイテムのステータスの数を取得します。したがって、出力は次のようになります。

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

等々。wc_audit_log以下の画像のような監査ログ テーブル ( ) からこのクエリを作成するのに苦労しました。他の列がありますが、ほとんどがテキストであり、このクエリには関係ありません (IMHO :)

ここに画像の説明を入力

group byと関数のさまざまな組み合わせを試してみましたがorder byyear, dayofmonth, monthこのクエリを組み立てる方法に頭を悩ませているようには見えません。最も厄介な部分は、バージョン管理に関して「日」の境界と重複です。つまり、同じ日にステータスを更新せずにアイテムを複数回更新したり、同じ日に複数のステータスを移行したりすることは完全に可能です。

そのため、ステータス ベースの重複の場合、最新のタイムスタンプ付きアイテムが選択されます。つまり、アイテムが 2 回更新され、ステータスが 2 回とも「オープン」であった場合は、最後の 1 つを選択してください。二重カウントは問題ありません。つまり、アイテムがオープンで、同じ日に合意された場合、両方の場所でカウントされても問題ありません。

ただし、そのようなクエリを組み立てる方法はまだわかりません。上の画像は、関連する列のみのテーブルの一部を表示する必要がありますが、私の意見では、これを重要なクエリにするために必要な重複などのアイデアも提供する必要があります。

PS: 削除済みとしてマークされたアイテムは考慮されないため、上記の表には含まれません。ただし、アイテムが削除されたが「過去」に存在した場合でも、上記は当てはまります。

4

3 に答える 3

1

私はこれがあなたが望むことをするだろうと思います。これは、毎日特定のステータスを持つwc_idの数をカウントします。1日以内の重複はカウントされません。

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は2日間同じステータスで2回カウントされます。

于 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 に答える