DB2-Abfrage-Top-Gruppierung nach
Frage
Ich habe es stundenlang versucht, kann aber die Abfrage nicht abrufen. Ich möchte Folgendes mit DB2 tun.Aus der Tabelle „Unternehmen und Benutzer“ habe ich die folgenden Ticketmengeninformationen pro Unternehmen/Benutzer
QUERY USING:
SELECT T.USER, COUNT(T.USER) AS QUANITTY, T.COMPANY FROM TICKET T
INNER JOIN COMPANY P ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY) ORDER BY QUANTITY DESC
Das Ergebnis ist:
user company quantity
----------------------------------
mark nissn 300
tom toyt 50
steve kryr 80
mark frd 20
tom toyt 120
jose toyt 230
tom nissn 145
steve toyt 10
jose kryr 35
steve frd 100
DAS SOLLTE DAS ERGEBNIS SEIN (Top-Benutzer pro Unternehmen)
user company quantity
----------------------------------
mark nissn 300
jose toyt 230
steve frd 100
steve kryr 80
Wie Sie sehen, gibt es viele Benutzer in einem Unternehmen und alle haben unterschiedliche Mengen pro Unternehmen, das Ergebnis sollte den Benutzer mit der höchsten Menge pro Unternehmen bringen.d.h.:Unternehmen nissn
Es hat 2 Benutzer und jeder hat (mit 300 markieren) und (mit 145 markieren)
Es sollte mir also den höchsten Benutzerwert geben, der mit 300 bewertet würde.Das Gleiche wäre für toyt
, frd
, kryr
.Ich brauche sie alle in einer Abfrage.
Ich frage mich, ob das in einer Abfrage möglich ist oder ob ich eine gespeicherte Prozedur erstellen muss.
Lösung
Sie können dies mit tun analytische Abfragen.Aber sei vorsichtig.Das Muster umfasst normalerweise verschachtelte Unterabfragen.(Einer zum Erstellen eines Datensatzes, der nächste zum Hinzufügen zum Muster, der dritte zum Auswählen der gewünschten Zeilen.)
In diesem Fall sollte es ungefähr so aussehen.
Ursprüngliche Anfrage.
SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
FROM TICKET T
JOIN COMPANY P
ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY)
Analytische Abfrage.(Notiere dass der s
besteht darin, die Unterabfrage zu benennen.Ich habe DB2 nicht verwendet, aber der Standard verhindert strikt nicht, dass sie gelöscht werden, und ich kenne mindestens eine Datenbank, die sie erfordert.)
SELECT user, quantity, company
, RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM ( ... previous query ... ) s
Endergebnis.
SELECT user, quantity, company
FROM ( ... previous query ... ) t
WHERE r = 1
Die kombinierte Abfrage lautet:
SELECT user, quantity, company
FROM (
SELECT user, quantity, company
, RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM (
SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY
FROM TICKET T
JOIN COMPANY P
ON P.COMPANY = T.COMPANY
GROUP BY (T.USER, T.COMPANY)
) s
) t
WHERE r = 1
Wie gesagt, ich habe DB2 nicht verwendet.Laut SQL-Standard sollte diese Abfrage jedoch funktionieren.