【问题标题】:Count consecutive duplicate values by group按组计算连续重复值
【发布时间】:2017-03-15 10:24:45
【问题描述】:

我已经在该网站上搜索了一些该问题的解决方案,但无法找到与我正在寻找的完全相符的答案。我正在尝试计算每个 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

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

【问题讨论】:

标签: sql duplicates teradata


【解决方案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;

【讨论】:

  • 查看他的数据,我只会做一个row_number() over (partition by id, value order by id) 不会只适用于戈登先生的这种情况吗?
【解决方案2】:

当值实际上一直在增加时,这应该可以工作:

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

否则,Teradata 对标准 SQL 进行了扩展,适用于以下情况:

row_number() 
over (partition by id
      order by date
      RESET WHEN MIN(value)  -- previous value not equal to current 
                 OVER (partition by id
                       order by date
                       rows between 1 preceding and 1 preceding) <> value
     ) - 1

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 2022-01-08
    • 2021-11-07
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多