我有以下数据
Col1 COl2
A 20-Mar-2020
B 22-Mar-2020
A 25-Mar-2020
B 28-Mar-2020
C 04-Apr-2020
D 10-Apr-2020
E 25-Apr-2020
在我的输出中,我想以仅当列值为A和C时才增加排名的方式显示排名,并且当列值为A和C时日期也会改变
我需要的输出是
Rank Col1 Col2
1 A 20-Mar-2020
1 B 20-Mar-2020
2 A 25-Mar-2020
2 B 25-Mar-2020
3 C 04-Apr-2020
3 D 04-Apr-2020
3 E 04-Apr-2020
有人可以帮我吗?
预先感谢
您可以使用累计金额:
select t.*,
sum(case when col1 in ('A', 'C') then 1 else 0 end) over (order by col2)
from t;
注意:这假定日期值是不同的(隐藏的时间分量)。如果没有,您可能想要:
select t.*,
sum(case when col1 in ('A', 'C') then 1 else 0 end) over (order by col2, col1)
from t;
我认为您需要如下两个级别的WINDOWS
函数:
select rnk, col1,
min(case when col1 in ('A', 'C') then col2 end)
over (partition by rnk) as col2
from
(select t.*,
sum(case when col1 in ('A', 'C') then 1 else 0 end)
over (order by col2) as rnk
from t);
Gordon的查询仅涵盖排名,问题的第二部分要求:
max(case when col1 in ('A', 'C') then col2 end)
over (order by col2)
如果按列排序与返回的列不同:
last_value(case when col1 in ('A', 'C') then col2 end ignore nulls)
over (order by col2) -- might be any other column, too