2016-07-25 92 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 
相关问题