2016-07-25 7 views
1

Ich habe eine Tabelle nach 1, 2 Spalten sortiert. Und ich muss die erste Zeile von der obersten Zeile und alle nachfolgenden Zeilen abrufen, während ihre Werte der zweiten Spalte dem Wert der ersten Zeile entsprechen.SQL: Reihenfolge von zwei Spalten und erhalten die ersten Zeilen mit gleichen Werten in der 2. Spalte

F.e I haben Datenabtastwert:

select * from sample 
order by ID desc, date desc 

ID Date 
--- ---- 
45 NULL 
44 NULL 
40 01/01/10 
35 NULL 
32 04/05/08 

ich brauche die ersten beiden Reihen (mit id in (45, 44)) zu erhalten, da 2-nd Reihe Date = NULL haben.

Wenn ich Datenprobe gehabt hatte:

ID Date 
--- ---- 
45 NULL 
44 NULL 
40 NULL 
35 NULL 
32 04/05/08 

Ich werde die ersten vier Reihen erhalten müssen (mit id in (45, 44, 40, 35)).

Ich kann keine Anfrage stellen, um mein Problem zu lösen. Ich habe darüber nachgedacht, row_number() und rank() zu verwenden, aber ich kann sie nicht für mich anpassen. Vielen Dank für jede Hilfe!

+0

Versuchen Sie 'Reihenfolge nach Datum, ID asc/decs'. Dies sortiert zuerst nach der zweiten Spalte und dann nach dem ersten (wenn Sie diese zweite Sortierung überhaupt brauchen). – FDavidov

+0

Warum würdest du nicht id = 35 im ersten Fall bekommen? –

+1

ist es einfach Gordon, weil Sie verschiedene Datumsspalte vor 35 '40 01/01/10' haben –

Antwort

0

Basierend auf Ihrer Beschreibung, können Sie etwas tun:

with t as (<your query here>) 
select t 
from t cross join 
    (select t.* 
     from t 
     order by id desc 
     limit 1 
    ) tt 
order by (case when t.date = tt.date or t.date is null and t2.date is null then 1 else 2 end), 
     t.id desc; 
+0

Cross join? Das Ergebnis wird größer als die Quellentabelle sein. – Vikora

+0

@ Wikora. . . LOL. Nicht, wenn die "Grenze 1" enthalten ist (wie ich es ursprünglich beabsichtigt hatte). –

0

Nun, ich so etwas wie dieses ausgedacht, aber es tut elegant aussehen.

select * 
from (
    select *, 
     sum(rank_date) over (partition by rank_date order by ID desc) as sm 
    from (
     select * 
      ,rank() over(order by DATE desc nulls first) rank_date 
      ,row_number() over(order by ID desc) rank_id 
     from sample 
    ) ss 
) s 
where sm = row_number 
Verwandte Themen