按组计算连续的重复值

时间:2017-03-14 18:24:33

标签: sql duplicates teradata

我已经搜索了一些网站以寻找这个问题的解决方案,但一直找不到符合我要求的答案。我试图计算每个ID号的连续重复值,按日期排序。我当前的表类似于下表中的前3列,而第四列则是我想要添加的内容。

ID  |  date  | value  | consec_duplicates
1      1/1       1            0
1      1/2       2            0
1      1/3       2            1
1      1/4       2            2
1      1/5       3            0
1      1/6       3            1
2      1/14      1            0
2      1/15      2            0
2      1/16      3            0
2      1/17      3            1
2      1/18      4            0
2      1/19      5            0
3      1/4       1            0
3      1/5       2            0
3      1/6       2            1
3      1/7       2            2
3      1/8       2            3
3      1/9       3            0

有没有人对如何构建第四列有任何想法?谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个差距和岛屿问题。一种方法是row_number() s的区别,以识别组。

select t.*,
       dense_rank() over (partition by id order by (seqnum - seqnum_value), value) as grp,
       row_number() over (partition by id, (seqnum - seqnum_value), value order by date) as grp_seqnum
from (select t.*,
             row_number() over (partition by id order by date) as seqnum,
             row_number() over (partition by id, value order by date) as seqnum_v
      from t
     ) t;

第一次看到它时,理解这一点有点棘手。如果你运行子查询并长时间凝视结果,你就会明白为什么相邻值的差值是不变的。

编辑:

我认为豪尔赫是对的。您的数据没有重复相同的值,因此您可以这样做:

select t.*,
       row_number() over (partition by id, value order by date) as grp_seqnum
from t;

答案 1 :(得分:1)

当值实际上一直在增加时,这应该有效:

ionic serve

否则Teradata对标准SQL有一个扩展,例如:

row_number() over (partition by id, value order by date) - 1