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

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

我有以下数据

  1. Col1 COl2
  2. A 20-Mar-2020
  3. B 22-Mar-2020
  4. A 25-Mar-2020
  5. B 28-Mar-2020
  6. C 04-Apr-2020
  7. D 10-Apr-2020
  8. E 25-Apr-2020

在我的输出中,我想以这样一种方式显示秩:当列值为a和c时,秩才增加;当列值为a和c时,日期也会改变
我需要的输出是

  1. Rank Col1 Col2
  2. 1 A 20-Mar-2020
  3. 1 B 20-Mar-2020
  4. 2 A 25-Mar-2020
  5. 2 B 25-Mar-2020
  6. 3 C 04-Apr-2020
  7. 3 D 04-Apr-2020
  8. 3 E 04-Apr-2020

有人能帮我吗?
提前谢谢

wswtfjt7

wswtfjt71#

我想你需要两层 WINDOWS 功能如下:

  1. select rnk, col1,
  2. min(case when col1 in ('A', 'C') then col2 end)
  3. over (partition by rnk) as col2
  4. from
  5. (select t.*,
  6. sum(case when col1 in ('A', 'C') then 1 else 0 end)
  7. over (order by col2) as rnk
  8. from t);
yk9xbfzb

yk9xbfzb2#

您可以使用累积和:

  1. select t.*,
  2. sum(case when col1 in ('A', 'C') then 1 else 0 end) over (order by col2)
  3. from t;

注意:这假设日期值是不同的(隐藏的时间组件)。如果没有,您可能需要:

  1. select t.*,
  2. sum(case when col1 in ('A', 'C') then 1 else 0 end) over (order by col2, col1)
  3. from t;
e5nszbig

e5nszbig3#

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

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

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

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

相关问题