以不同的方式填充排名

时间:2018-01-15 03:22:51

标签: sql teradata

我的表中有以下数据 -

ColumnA ColumnB ColumnC ColumnD
111 555 1-Jan   5-Jan
111 555 5-Jan   9-Jan
111 222 9-Jan   15-Jan
111 555 15-Jan  20-Jan
111 222 20-Jan  1-Feb
111 333 1-Feb   10-Feb
111 333 10-Feb  1-Mar
111 333 1-Mar   4-Mar
111 444 4-Mar   31-Dec

我想填充表格中的columnE,它应该如下所示 -

ColumnA ColumnB ColumnC ColumnD ColumnE
111 555 1-Jan   5-Jan   1
111 555 5-Jan   9-Jan   1
111 222 9-Jan   15-Jan  2
111 555 15-Jan  20-Jan  3
111 222 20-Jan  1-Feb   4
111 333 1-Feb   10-Feb  5
111 333 10-Feb  1-Mar   5
111 333 1-Mar   4-Mar   5
111 444 4-Mar   31-Dec  6

我想从第1行开始计数(ColumnB的最低日期),如果值相同则分配相同的计数,如果值正在改变则增加值。 在第4行中,555再次重复,但我想将其赋值为3,因为它不是重复。仅当值与最后一个值相同时才分配相同的值。

我正在teradata工作。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,这是一个缺口和岛屿问题。一种解决方案使用行号的差异:

select t.*,
       dense_rank() over (order by seqnum - seqnum_b, columna, columnb) as rank
from (select t.*,
             row_number() over (partition by columna, columnb order by columnc) as seqnum_b,
             row_number() over (order by columnc) as seqnum
      from t
     ) t;