如何计算元素在Teradata中的表中连续出现的次数?

时间:2015-04-16 00:08:50

标签: sql teradata

我有一张看起来像这样的表

ID, Order, Segment
1, 1, A
1, 2, B
1, 3, B
1, 4, C
1, 5, B
1, 6, B
1, 7, B
1, 8, B

基本上使用Order列排序数据。我想了解每个ID的连续B的数量。理想情况下,我想要的输出是

ID, Consec
1, 2
1, 4

因为B段连续出现在第2行和第3行(2次),然后再出现在第5,6,7,8行(4次)中。

我无法想到SQL中的解决方案,因为SQL中没有循环工具。

Teradata SQL中是否有优雅的解决方案?

P.S。我正在处理的数据有大约2000万行。

在R中这样做的方法已在这里发表。

How to count the number of times an element appears consecutively in a data.table?

1 个答案:

答案 0 :(得分:4)

分析功能很容易。虽然我对teradata一无所知,但快速谷歌搜索使它看起来好像支持分析功能。

无论如何,我在Oracle中测试了以下内容 -

  select id,
         count(*)
    from (select x.*,
                 row_number() over(partition by id order by ord) -
                 row_number() over(partition by id, seg order by ord) as grp
            from tbl x) x
   where seg = 'B'
group by id, grp
order by grp

诀窍是建立Bs的'群体'。

小提琴:http://sqlfiddle.com/#!4/4ed6c/2/0