有没有办法根据 Hive/SQL 中的条件初始化计数器?
Posted
技术标签:
【中文标题】有没有办法根据 Hive/SQL 中的条件初始化计数器?【英文标题】:Is there a way to initialize a counter based on condition in Hive/SQL? 【发布时间】:2020-03-05 16:43:51 【问题描述】:我有一个表,我需要在其中标记每个组的不同事务的数量。如果两个后续交易之间的天数小于 7 则视为同一交易,否则视为不同交易。
我拥有的 tx_data 表如下所示:
User tx_Dt
A 1/10/2018
A 1/10/2018
A 1/10/2018
A 1/11/2019
A 1/11/2019
A 1/11/2019
A 1/12/2019
A 1/12/2019
D 1/29/2019
D 2/4/2019
D 2/5/2019
E 12/14/2019
E 12/14/2019
E 12/16/2019
E 12/28/2019
想要的输出是:
User tx_Dt tx_tag
A 1/10/2018 1
A 1/10/2018 1
A 1/10/2018 1
A 1/11/2019 2
A 1/11/2019 2
A 1/11/2019 2
A 1/12/2019 2
A 1/12/2019 2
D 1/29/2019 1
D 2/4/2019 1
D 2/5/2019 1
E 12/14/2019 1
E 12/14/2019 1
E 12/16/2019 1
E 12/28/2019 2
我尝试了多种方法,例如 case when、sum() over(partition by order by)、inner joins,但无法启动一个计数器,该计数器在每个组中逐级重新初始化。
【问题讨论】:
【参考方案1】:使用lag()
和累积总和:
select t.*,
sum(case when prev_tx_dt > date_add(tx_dt, -7) then 0 else 1 end) over (partition by user order by tx_dt) as tx_tag
from (select t.*,
lag(tx_Dt) over (partition by user order by tx_Dt) as prev_tx_dt
from t
) t;
【讨论】:
这使我下面的输出:t.user t.tx_dt t.prev_tx_dt tx_tag
987654324 A 1/10/2018 1/10/2018 3
987654326 A 1/11/2019 1/11/2019 6
987654328 A 1/11/2019 1/10/2018 6
987654330 A 1/12/2019 1/12/2019 8
987654332 D 2/4/2019 1/29/2019 2
987654334 @E 12/14/2019 12/14/2019 2
E 12/14/2019 2
E 12/16/2019 12/14/2019 3
E 12/28/2019 12/16/2019 4
以上是关于有没有办法根据 Hive/SQL 中的条件初始化计数器?的主要内容,如果未能解决你的问题,请参考以下文章