DB2 Query Top Group di
Domanda
Ci ho provato per ore ma non riesco a gettare la query, voglio fare quanto segue usando DB2. Dalla compagnia di tabelle e utenti ho le seguenti informazioni sulla quantità dei biglietti per azienda/utente
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
Il risultato è:
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
Questo dovrebbe essere il risultato (top utente per azienda)
user company quantity
----------------------------------
mark nissn 300
jose toyt 230
steve frd 100
steve kryr 80
Come puoi vedere ci sono molti utenti in un'azienda e ognuno ha quantità diverse per azienda, il risultato dovrebbe ottenere l'utente con la più alta quantità per azienda. cioè: compagnia nissn
Ha 2 utenti e ciascuno ha (marchio con 300) e (Tom con 145)
Quindi dovrebbe darmi il più alto utente che sarebbe marchio con 300. Lo stesso sarebbe per toyt
, frd
, kryr
. Li ho bisogno di tutti in una domanda.
Mi chiedo se ciò sia possibile in una query o dovrò creare una procedura memorizzata.
Soluzione
Puoi farlo con query analitiche. Ma fa attenzione. Il modello di solito funziona per coinvolgere sottoquerie nidificate. (Uno per produrre un set di dati, il prossimo per aggiungerlo al modello, il terzo per selezionare le righe desiderate.)
In questo caso dovrebbe assomigliare a questo.
Query originale.
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)
Query analitica. (Nota che il s
è nominare la sottoquery. Non ho usato DB2, ma lo standard rigorosamente non impedisce che vengano abbandonati e conosco almeno un database che li richiede.)
SELECT user, quantity, company
, RANK () OVER (PARTITION BY company ORDER BY quantity DESC) as r
FROM ( ... previous query ... ) s
Risultato finale.
SELECT user, quantity, company
FROM ( ... previous query ... ) t
WHERE r = 1
La query combinata è:
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
Come ho detto non ho usato DB2. Ma secondo lo standard SQL, quella query dovrebbe funzionare.