SQL:按两列排序,并在第二列中获取具有相等值的第一行

时间:2016-07-25 12:54:45

标签: sql vertica

我有一个按1,2列排序的表。我需要从顶部和所有后续行获取第一行,而它们的第二列值与第一行的值相同。

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)),因为第二行有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(),但我不能让它适应我的目的。 非常感谢您的帮助!

2 个答案:

答案 0 :(得分: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;

答案 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