排名应仅针对特定列值增加

问题描述 投票:0回答:3

我有以下数据

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

有人可以帮我吗?

预先感谢

sql oracle aggregate
3个回答
0
投票

您可以使用累计金额:

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;

0
投票

我认为您需要如下两个级别的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);

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.