我有一张这样的桌子:
Row# ID Indicator
1 001 Yes
2 001 No
3 001 No
4 001 No
5 001 No
6 001 Yes
7 001 No
8 002 No
9 002 No
10 002 No
11 002 No
12 002 No
13 002 No
14 002 Yes
15 002 No
16 003 No
17 003 Yes
18 003 No
19 003 No
20 003 No
21 003 No
22 004 No
. . .
. . .
100 020 Yes
我希望有一个计数器,计数数为每3个连续'No‘,并按ID分组。计数器函数在看到"No“时触发。一旦连续出现三行“否”,计数器=计数器+ 1。不允许重复计数。
例如:
对于ID = 001,从第2行到第4行有三个连续的"No“,所以计数器值= 1。
由于使用了从第2行到第4行的“否”,所以由于没有双重计数规则,所以不能将第3行到第5行计算为事件。
对于ID = 002,从第8行到第10行和从第11行到第13行有三个连续的"No“,因此计数器值= 2。
所需的输出如下:
ID Counter
001 1
002 2
003 1
. .
. .
100 0
编辑1:行#不是真正的列。这是为了解释。
编辑2:我意识到row#对于这个问题是必不可少的。我们再把它变成一个真正的专栏吧。因此,上面给出的原始数据样本仍然有效。
发布于 2015-04-10 01:07:54
Hive支持row_number()
,因此您可以使用它来枚举值。逻辑一开始可能并不明显,但其思想是枚举连续的"N“值,并将结果除以3。后一部分是获取所需序列数的逻辑。
以下版本假设“N”只有一个长序列,这是问题中数据的格式:
select t.id, max(floor(seqnum / 3.0))
from (select t.*,
row_number() over (partition by id, indicator, grp order by row#) as seqnum
from (select t.*,
(row_number() over (partition by id order by row#) -
row_number() over (partition by id, indicator order by row#)
) as grp
from table t
) t
) t
where indicator = 'N'
group by id;
可以对此进行修改,以处理给定id的多个“N”序列,但是查询要复杂一些。
编辑:
我认识到以下几点比较笼统:
select t.id, sum(case when pmod(seqnum, 3) = 0 then 1 else 0 end)
https://stackoverflow.com/questions/29551584
复制相似问题