rank应该只对特定的列值增加

ajsxfq5m  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(306)

我有以下数据

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

有人能帮我吗?
提前谢谢

wswtfjt7

wswtfjt71#

我想你需要两层 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);
yk9xbfzb

yk9xbfzb2#

您可以使用累积和:

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;
e5nszbig

e5nszbig3#

戈登的问题只涉及排名,问题的第二部分要求:

max(case when col1 in ('A', 'C') then col2 end) 
over (order by col2)

如果order by列与返回列不同:

last_value(case when col1 in ('A', 'C') then col2 end ignore nulls)
over (order by col2) -- might be any other column, too

相关问题