2016-09-13 4 views
0

Ich habe eine Tabelle hier: enter image description hereReward Punkte an den bereits erstellten Felder suchen

Ich möchte ein Gold und ein Silber belohnen (dh einen Wert von 1, wo anwendbar, sonst 0) 2 Personen nach oben durch Blick auf pointsRarwared Feld.

Ich habe bereits die erste Tabelle erstellt. Ich möchte eine neue Tabelle mit den zwei neuen Feldern, d. H. Die Gold- und Silberfelder.

Ich möchte die Ausgabe so etwas sein: enter image description here

Bitte helfen Sie mir mit der Abfrage oder geben Sie mir einige Vorschläge, wie es weitergeht.

Vielen Dank.

Antwort

1

Ich glaube, Sie dense_rank() dafür verwenden möchten:

select t.*, 
     (case when rnk = 1 then 1 else 0 end) as gold, 
     (case when rnk = 2 then 1 else 0 end) as silver 
from (select t.*, 
      dense_rank() over (partition by week order by pointsrewarded) as rnk 
     from t 
    ) t; 

dense_rank() wird behandeln den Fall, wenn es Bindungen sind. In diesem Fall werden mehrere "Gold" - und "Silber" -Werte zugewiesen.

Ich sollte auch beachten, dass die Unterabfrage nicht notwendig ist. Sie können die dense_rank() in der äußeren Abfrage wiederholen. Ich denke nur, dass es einfacher ist, der Logik auf diese Weise zu folgen.

+0

wahre Genie .. !! –

+0

Wie erstelle ich die Rnk, Gold und Silber Felder fest codiert in der ursprünglichen Tabelle, d. H. Die erste Tabelle mit dem Ergebnis der Abfrage..Plz vorschlagen –

0

Achten Sie darauf, nach Punkten zu bestellen, absteigend, so ersten Platz ist die höchste Punkte und nicht die niedrigste. Mein Code ist länger, aber ich finde es einfacher zu lesen (persönliche Präferenz).

--create table employee (employeeid int, employeename varchar(50), weeknumber int, pointsRewarded int, Hours int) 
--insert into employee values (111, 'person1', 1, 400, 2) 
--insert into employee values (112, 'person2', 1, 100, 10) 
--insert into employee values (113, 'person3', 1, 200, 10) 
--insert into employee values (111, 'person1', 2, 100, 2) 
--insert into employee values (112, 'person2', 2, 50, 10) 
--insert into employee values (113, 'person3', 2, 200, 10) 
--insert into employee values (111, 'person1', 3, 20, 4) 
--insert into employee values (112, 'person2', 3, 25, 5) 
--insert into employee values (113, 'person3', 3, 100, 6) 

;WITH Medals AS 
(
    SELECT 
     employeeid 
     ,employeename 
     ,weeknumber 
     ,pointsRewarded 
     ,hours 
     ,ROW_NUMBER() OVER (PARTITION BY weeknumber ORDER BY pointsrewarded DESC) medal 
    FROM 
     employee 
) 
SELECT 
     employeeid 
     ,employeename 
     ,weeknumber 
     ,pointsRewarded 
     ,hours 
     ,CASE WHEN medal = 1 THEN 1 ELSE 0 END AS gold 
     ,CASE WHEN medal = 2 THEN 1 ELSE 0 END AS silver 
FROM  
    Medals 
+0

Awesome.Does der Job .. !! –

Verwandte Themen