Reputation: 16074
I have a table that looks like this
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
Basically by ordering the data using the Order column. I would like to understand the number of consecutive B's for each of the ID's. Ideally the output I would like is
ID, Consec
1, 2
1, 4
Because the segment B appears consecutively in row 2 and 3 (2 times), and then again in row 5,6,7,8 (4 times).
I can't think of a solution in SQL since there is no loop facility in SQL.
Are there elegant solutions in Teradata SQL?
P.S. The data I am dealing with has ~20 million rows.
The way to do it in R has been published here.
How to count the number of times an element appears consecutively in a data.table?
Upvotes: 1
Views: 1044
Reputation: 13248
It is easy to do with analytic functions. While I don't know anything about teradata, quickly googling makes it appear as though it does support analytic functions.
In any case, I've tested the following in 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
The trick is establishing the 'groups' of Bs.
Fiddle: http://sqlfiddle.com/#!4/4ed6c/2/0
Upvotes: 4