2016-06-22 1 views
8

Hallo Ich habe eine Tabelle mit Spalten J1, J2, J3, J4, J5, J6, J7. Ich möchte die größten 3 Werte aus diesen Spalten als L1, L2, L3 finden.Wie finde ich erste, zweite und drittgrößte Werte aus verschiedenen Spalten in SQL

habe ich versucht, die unter Abfrage der erste größte

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

Befindet sich ein PK in der Tabelle? –

+0

PL/SQL ist die Sprache von Oracle für gespeicherte Prozeduren. SQL Server ist ein völlig anderes DBMS. Also, was benutzt du wirklich? Oracle oder SQL Server? Aus dem Beispiel zu schließen, ist es SQL Server und nicht Oracle –

+1

Im Allgemeinen ein Zeichen eines gebrochenen Datenmodells - alle Werte des gleichen "type" (so dass es sinnvoll ist, zwei solche Werte zu vergleichen oder Aggregate auf ihnen zu berechnen) sollte sein * eine * Spalte. Und dann sollte es eine zusätzliche Spalte geben, wenn die Zahlen 1-7 tatsächlich aussagekräftig sind * Daten *, die in Ihren Spaltennamen eingebettet sind. –

Antwort

6

Wenn Ihre Tabelle ein PK hat, sagen id, dann können Sie verwenden, um eine Abfrage, die Mitarbeiter UNPIVOT zu finden:

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 

Wenn Sie Wollen Sie eine Zeile pro id, dann können Sie PIVOT verwenden, um die UNPIVOT Operation rückgängig zu machen:

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

Es holt nicht die Top-3-Werte, ich habe die Abfrage ein bisschen geändert, da ich Top-8-Werte aus einer Liste von 53 Spalten haben muss und es mehr als 2000 Zeilen hat. Unten ist die Abfrage, die ich für '\t \t \t \t SELECT ID, [1], [2], [3] verwendet habe ....., [7], [8] INTO TEMP6 \t \t \t \t FROM (SELECT ID, Val, rn \t \t \t \t FROM (id, Val, Col, \t \t \t \t ROW_NUMBER() OVER (PARTITION BY id SELECT ORDER BY Val DESC) AS rn \t \t \t \t FROM Temp5 \t \t \t \t UNPIVOT (Val Col IN ([Week1], \t \t \t \t [Woche2], [Woche3], [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 (Wert) FOR rn IN ([1], [2], ..., [7], [8])) AS pvt' –

Verwandte Themen