Frage

Ich habe zu tun, damit beauftragt, einige Berichte auf unserer Request Tracker Nutzung zu generieren. Request Tracker ein Ticketing-System, das wir für mehrere Abteilungen verwenden waren ich arbeite. Um dies zu tun Ich bin für den Tag einen nächtlichen Schnappschuss von Informationen über Tickets nehme in einer anderen Datenbank geändert. Dieser Ansatz abkoppelt meine Berichterstattung aus dem dem internen Datenbank-Schema, das RT verwendet.

Neben vielen anderen Fragen für den Bericht, muß ich berichten, wie viele Tickets wurden in jedem Monat pro Abteilung aufgelöst. In RT ist die Abteilung als Custom gespeichert, und meine Modellierung folgt diesem Trend, wie Sie in meiner Anfrage unten sehen können. Jedoch darauf zurückzuführen, wie ich Schnappschüsse jede Nacht bin Grabbing, ich habe mehrere Zeilen für ein Ticket, und das Department Feld kann über den Monat ändern. Ich bin daran interessiert sind nur in der letzten Abteilung Feld. Ich weiß nicht, wie das in einer Abfrage zu erhalten.

Ich weiß, ich ‚GROUP BY‘ auf meine Abfrageergebnisse reduzieren bis auf ein pro Ticket verwenden, aber wenn ich das tue, ich weiß nicht, wie die letzte Abteilung Einstellung zu greifen. Da die Abteilungen alle Saiten sind, ein MAX () doesnt't die letzten zu bekommen. MySQL nicht benötigen Sie eine Aggregatfunktion für Felder verwenden Sie die Auswahl, aber die Ergebnisse sind unbestimmt (aus meiner Prüfung es sieht aus wie die erste auf meiner Version von MySQL greifen könnte).

Zur Veranschaulichung hier die Ergebnisse aus einer Abfrage, die mir zwei Karten zeigt, und alle IT-Abteilung Feldeinstellungen:

"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"

Wie wir sehen können, wurden beiden Tickets am 26. geschlossen, und beide Karten hatten ein leeres Feld Abteilung für ein paar Tage, wenn sie zum ersten Mal auftauchen. Ich habe meine Abfrage unten enthalten, können Sie sehen, dass ich künstlich die Anzahl der Spalten beschränkt habe in der zweiten Hälfte der where-Anweisung zurückgegeben:

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

Wie kann ich diese Abfrage ändern, damit ich eine Ergebnismenge erhalten, die mir, dass es im Oktober erzählt ein Ticket für „FS Students“ geschlossen war und ein Ticket geschlossen für „Konferenz / Besucher“?

War es hilfreich?

Lösung

Dies ist das „größte-n-per-Gruppe“ Problem, das häufig auf Stack-Überlauf kommt.

Hier ist, wie ich es in Ihrem Fall lösen würde:

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;

Andere Tipps

Mysql keinen LAST-Operator, so dass Sie wirklich dieses mit einer temporären Tabelle müssen tun.

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

, dass Sie eine Tabelle mit dem letzten Datum für jedes Ticket bekommt. Dann in Ihrem Haupt-Abfrage beitreten gegen diese Tabelle mit den beiden ticket_num und Datumsfelder. Dies wird herauszufiltern alle Zeilen, für die das Datum nicht die letzte für die entsprechende Ticket-Nummer ist.

Sie können einen Index für diese temporäre Tabelle benötigen, werde ich überlasse das Ihnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top