2017-09-11 2 views
-2

Frage Eingang:Row wise oberen 3 Maximalwerte IN TABELLE

c1 c2 c3 c4 c5 c6 
-- -- -- -- -- -- 
A 1 5 10 7 9 
B 11 12 30 5 4 
C 5 6 7 2 20 
D 3 5 4 1 2 

Erwartete Leistung:

A C4 C6 C5  
B C4 C3 C2  
C C6 C4 C3  
D C3 C4 C2 

die drei Maximalwerte in jeder Zeile zu finden.

+3

Shouting bekommt man nirgends gezeigt Mühe, die Sie Antworten bekommt. – HoneyBadger

+0

@HoneyBadger hat Recht. Probieren Sie http://sqlfiddle.com/, um zu demonstrieren, was Sie getan haben – kenfire

+3

Markieren Sie auch Ihre Frage mit der Datenbank, die Sie verwenden. –

Antwort

1

Diese Lösung verwendet zuerst UNPIVOT, um die Spalten in Zeilen umzuwandeln.

und ROW_NUMBER, um eine Zahl für die Bestellung basierend auf dem Wert zu erhalten.

Dann wird PIVOT für diese Zeilennummer verwendet, um die obersten 3 Spalten zu erhalten.

-- using a table variable to demonstrate 
declare @T table (c1 varchar(1), c2 int, c3 int, c4 int, c5 int, c6 int); 

-- test data 
insert into @T (c1,c2,c3,c4,c5,c6) values 
('A', 1, 5, 10, 7, 9), 
('B', 11, 12, 30, 5, 4), 
('C', 5, 6, 7, 2, 20), 
('D', 3, 5, 4, 1, 2); 

select c1, [1] as Max1, [2] as Max2, [3] as Max3 
from 
(
    select 
    c1, upper(col) as col, 
    row_number() over (partition by c1 order by val desc, col) as rn 
    from @T t 
    unpivot (val for col in (c2, c3, c4, c5, c6)) up 
) q 
pivot (max(col) for rn in ([1],[2],[3])) as p 

Ergebnisse:

c1 Max1 Max2 Max3 
A C4 C6 C5 
B C4 C3 C2 
C C6 C4 C3 
D C3 C4 C2