我有一个按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()
,但我不能让它适应我的目的。
非常感谢您的帮助!
答案 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