2016-06-22 18 views
8

Ciao Ho una tabella con colonne J1, J2, J3, J4, J5, J6, J7. Voglio trovare i 3 valori più grandi di queste colonne come L1, L2, L3.come trovare i valori primo, secondo e terzo più grande da diverse colonne in SQL

ho provato la domanda qui sotto per trovare il primo grande

SELECT (
    SELECT Max(v) FROM (
     VALUES 
      ([J1]), ([J2]), 
      ([J3]), ([J4]), 
      ([J5]), ([J6]), 
      ([J7]) 
    ) AS value(v) 
) as [L1]FROM dbo.JTable 
+0

C'è un PK nella tabella? –

+0

PL/SQL è la lingua Oracle per le stored procedure. SQL Server è un DBMS completamente diverso. Allora, cosa stai _ veramente usando? Oracle o SQL Server? A giudicare dall'esempio, è SQL Server e non Oracle –

+1

Generalmente un segno di un modello di dati rotti - tutti i valori dello stesso "tipo" (tale che è significativo confrontare due valori di questo tipo, o calcolare aggregati su di essi) dovrebbero essere * una * colonna. E poi ci dovrebbe essere una colonna aggiuntiva se i numeri 1-7 sono effettivamente * dati * che sono stati incorporati nei nomi delle colonne. –

risposta

6

Se la tabella ha una PK, dire id, quindi è possibile utilizzare una query che i dipendenti UNPIVOT:

SELECT * 
FROM (
    SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY Val) AS rn 
    FROM JTable 
    UNPIVOT (
    Val FOR Col IN (J1, J2, J3, J4, J5, J6, J7)) AS unpvt) AS t 
WHERE t.rn <= 3 

Se desidera una riga per id, quindi è possibile utilizzare PIVOT per annullare l'operazione UNPIVOT:

SELECT id, [1], [2], [3] 
FROM (
    SELECT id, Val, rn 
    FROM (
    SELECT id, Val, Col, 
      ROW_NUMBER() OVER (PARTITION BY id ORDER BY Val) AS rn 
    FROM JTable 
    UNPIVOT (
     Val FOR Col IN (J1, J2, J3, J4, J5, J6, J7)) AS unpvt) AS t 
    WHERE t.rn <= 3) AS src 
PIVOT (
    MAX(Val) FOR rn IN ([1], [2], [3])) AS pvt 
+0

Non sta recuperando i primi 3 valori, ho modificato la query un po 'poiché ho bisogno di avere i primi 8 valori da un elenco di 53 colonne e ha più di 2000 righe. Di seguito è la query che ho usato per '\t \t \t \t ID SELECT, [1], [2], [3] ....., [7], [8] IN TEMP6 \t \t \t \t FROM (SELECT id, Val, rn \t \t \t \t FROM (SELECT id, Val, Col, \t \t \t \t ROW_NUMBER() OVER (PARTITION BY id ORDER BY Val DESC) AS RN \t \t \t \t DA TEMP5 \t \t \t \t UNPIVOT (Val PER Col IN ([Week1], \t \t \t \t [settimana2], [Week3], [Week4] ..... [Week53] \t \t \t \t)) AS unpvt) AS t \t \t \t \t WHERE t.rn <= 8) AS src \t \t \t \t PIVOT (MAX (Val) PER rn IN ([1], [2], ..., [7], [8])) AS pvt' –