2016-07-25 57 views
1

我有一個按1,2列排序的表。我需要從頂部和所有後續行中獲取第一行,而第二列的值與第一行的值相同。SQL:按兩列排序並在第二列中獲得具有相同值的第一行

F.e我有數據樣本:

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 

我需要讓前兩排(帶有id in (45, 44)),因爲2次排有Date = NULL

如果我有數據樣本:

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

我需要拿到第4行(與id in (45, 44, 40, 35))。

我無法通過查詢來解決我的問題。我考慮過使用row_number()rank(),但我無法適應他們對我的目的。 非常感謝您的幫助!

+0

嘗試按日期排序,ID asc/decs'。這將首先按第二欄排序,然後按第一欄排序(如果您需要第二欄排序)。 – FDavidov

+0

爲什麼不在第一種情況下得到id = 35? –

+1

其簡單的戈登,因爲你有不同的日期列之前35'40 01/01/10' –

回答

0

根據您的描述,你可以這樣做:

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

交叉連接?結果將會比源表更大。 – Vikora

+0

@Vikora。 。 。大聲笑。如果包含「限制1」(如我原本打算的那樣),則不行。 –

0

好了,我炮製出這樣的事情,但它不看典雅。

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 
相關問題