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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top