有没有办法根据 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 2E 12/14/2019 2E 12/16/2019 12/14/2019 3E 12/28/2019 12/16/2019 4

以上是关于有没有办法根据 Hive/SQL 中的条件初始化计数器?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法有条件地#define 依赖项中的符号?

Flutter Forms:有没有办法根据某些条件更改输入文本的颜色?

Twitter Data:有没有办法根据条件进行拆分?

Hive Sql 大全

有没有办法在条件下使用多种数据类型过滤Python中的列?

有没有办法根据条件在新页面中显示特定的内联?