2016-05-08 12 views
-1

Ich habe eine Tabelle mit SQL verwendet folgende Bedingung erstellt:wie die folgende Bedingung in SQL auszuführen?

create table tbl2 as 
select a.*, rank() over (partition by col1 order by col2) as rnk 
from tbl1 

jetzt will ich von tbl2 einen anderen Tisch schaffen, in dem ich die Platte unter folgender Bedingung auswählen möchten: Wenn ein Datensatz nur noch einen Rang I zur Verfügung hat, dann wähle diesen Datensatz, aber wenn der Datensatz mehrere Ränge verfügbar hat, dann wähle ich den Datensatz mit dem zweiten Rang. Lassen Sie mich ein Beispiel geben:

col1 rnk 
1  1 
2  1 
2  2 
3  1 
3  2 
3  3 

gewünschte Ausgabe:

col1 rnk 
1  1 
2  2 
3  2 

wie erhalte ich meine Ausgabe mit SQL?

+3

was rdbms arbeiten Sie mit? –

+0

Ich benutze Orakel 11g – user3740154

+0

meine Antwort sollte mit SQL-Server arbeiten, ich bin mir nicht sicher, wie Orakel damit umgehen wird. Bitte testen Sie es und sehen Sie. Bei zukünftigen Fragen markieren Sie bitte die entsprechenden rdbms. –

Antwort

0

So etwas sollte es tun:

SELECT col1, rnk 
FROM 
(
    SELECT col1, rnk, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY CASE WHEN rnk = 2 THEN 0 ELSE 1 END) rn 
    FROM tbl2 
) x 
WHERE rn = 1 

Mit case in der Reihenfolge von der row_number Funktion erhält die rnk = 2 zuerst und dann alle anderen.
Wählen Sie dann nur die Datensätze aus, in denen row_number 1 ist, also ist es entweder der einzige Datensatz in der col1 Gruppe oder der mit rnk = 2.

1

würde Der naive Ansatz sein: für die Fälle

select * 
from tbl2 t 
where rnk = 2 or not exists (select 1 from tbl2 where col1 = t.col1 and rnk <> t.rnk) 

Das wird nicht funktionieren, wo der 2. Rang nicht 2 ist, obwohl ...

+0

Ich mag diesen Ansatz mehr als meine eigene Antwort. +1. –

Verwandte Themen