2

Request Tracker の使用状況に関するレポートを作成する任務を負っています。Request Trackerは、私が働いているいくつかの部門で使用するチケット システムです。これを行うために、その日に変更されたチケットに関する詳細のスナップショットを毎晩別のデータベースに取り込んでいます。このアプローチは、RT が使用する内部データベース スキーマからレポートを切り離します。

レポートに関する他の多くの質問の中で、部門ごとに毎月解決されたチケットの数を報告する必要があります。RT では、部門は CustomField として保存され、以下のクエリでわかるように、モデリングはその傾向に従います。ただし、毎晩スナップショットを取得しているため、1 つのチケットに複数の行があり、Department フィールドは 1 か月で変わる可能性があります。私は最新の部門フィールドにのみ興味があります。クエリでそれを取得する方法がわかりません。

「GROUP BY」を使用してクエリ結果をチケットごとに 1 つに減らすことができることはわかっていますが、そうすると、最後の部門設定を取得する方法がわかりません。部門はすべて文字列であるため、MAX() は最後のものを取得しません。MySQL では、選択しているフィールドに集計関数を使用する必要はありませんが、結果は不確定です (私のテストでは、私のバージョンの MySQL では最初の関数を取得する可能性があるようです)。

例として、2 つのチケットとすべての部門フィールド設定を示すクエリの結果を次に示します。

"ticket_num","date","QueueName","CF","CFValue","closed"
35750,"2009-09-22","IT_help","Department","",""
35750,"2009-09-23","IT_help","Department","",""
35750,"2009-09-24","IT_help","Department","",""
35750,"2009-09-25","IT_help","Department","",""
35750,"2009-09-26","IT_help","Department","",""
35750,"2009-10-02","IT_help","Department","",""
35750,"2009-10-03","IT_help","Department","",""
35750,"2009-10-12","IT_help","Department","",""
35750,"2009-10-13","IT_help","Department","",""
35750,"2009-10-26","IT_help","Department","Conference/Visitors","2009-10-26 10:10:32"
35750,"2009-10-27","IT_help","Department","Conference/Visitors","2009-10-26 10:10:32"
36354,"2009-10-20","IT_help","Department","",""
36354,"2009-10-21","IT_help","Department","",""
36354,"2009-10-22","IT_help","Department","FS Students",""
36354,"2009-10-23","IT_help","Department","FS Students",""
36354,"2009-10-26","IT_help","Department","FS Students","2009-10-26 12:23:00"
36354,"2009-10-27","IT_help","Department","FS Students","2009-10-26 12:23:00"

ご覧のとおり、両方のチケットは 26 日にクローズされ、最初に表示された数日間、両方のチケットの Department フィールドが空でした。以下にクエリを含めます。where ステートメントの後半で返される列の数を人為的に制限していることがわかります。

SELECT d.ticket_num, d.date, q.name as QueueName, cf.name as CF, cfv.value as CFValue, d.closed
FROM daysCF dcf
INNER JOIN daily_snapshots d on dcf.day_id = d.id
INNER JOIN Queues q on d.queue_id = q.id
INNER JOIN CustomFieldValues cfv on dcf.cfv_id = cfv.id
INNER JOIN CustomFields cf on cf.id = cfv.field_id
WHERE cf.name = 'Department' and (d.ticket_num = 35750 or d.ticket_num = 36354)
ORDER by d.ticket_num, d.date

そのクエリを変更して、10 月に「FS 学生」のチケットが 1 枚、「カンファレンス/ビジター」のチケットが 1 枚クローズされたことを示す結果セットを取得するにはどうすればよいですか?

4

2 に答える 2

0

これは、Stack Overflow で頻繁に発生する「グループあたり最大 n」の問題です。

あなたのケースでそれを解決する方法は次のとおりです。

SELECT d1.ticket_num, d1.date, q.name as QueueName, 
  cf.name as CF, cfv.value as CFValue, d1.closed
FROM daysCF dcf
INNER JOIN daily_snapshots d1 ON (dcf.day_id = d1.id)
INNER JOIN Queues q ON (d1.queue_id = q.id)
INNER JOIN CustomFieldValues cfv ON (dcf.cfv_id = cfv.id)
INNER JOIN CustomFields cf ON (cf.id = cfv.field_id)
LEFT OUTER JOIN daily_snapshots d2 ON (d1.ticket_num = d2.ticket_num AND d1.date < d2.date)
WHERE d2.id IS NULL AND cf.name = 'Department'
ORDER by d1.ticket_num, d1.date;
于 2009-10-28T06:29:00.603 に答える
0

Mysql には LAST 演算子がないため、一時テーブルを使用してこれを行う必要があります。

CREATE TEMPORARY TABLE last_dates SELECT ticket_num, MAX(date) AS date
  FROM daily_snapshots GROUP BY ticket_num

これにより、各チケットの最終日付のテーブルが得られます。次に、メイン クエリで、ticket_num フィールドと date フィールドの両方を使用して、このテーブルと結合します。これにより、対応するチケット番号の日付が最新でないすべての行が除外されます。

その一時テーブルにインデックスが必要になる場合がありますが、それはお任せします。

于 2009-10-28T06:23:28.163 に答える