排名应该只针对特定的列值增加

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

我有以下数据

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

在我的输出中,我想以这样的方式显示Rank,只有当列值是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
1个回答
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
投票

你可以使用累加和。

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
投票

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

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.