分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0

Bucketing Data, If Bucket Size Greater Then 1 Set Value To 1 Else 0

我正在使用 snowflake 尝试基于两列对行进行分桶,如果该分桶大小大于 1,那么我需要一些新列的值为 1,否则我将设置它为 0。它类似于 NTILE() 除了我需要它是动态的。

我的 table 如下所示:

ARTICLE_ID      USER_ID     COUNTRY_NAME    NUM_COUNTRIES   NUM_AUTHORS
------------------------------------------------------------------------
30522143        ecf330d     Singapore       1               4
30522143        86b0faa     Singapore       1               4
30522143        d331b33     Singapore       1               4
30522143        d331b33     Singapore       1               4
------------------------------------------------------------------------
30522139        1d08cfd     United States   2               3
30522139        ec9c065     Canada          2               3
30522139        a750bff     United States   2               3
------------------------------------------------------------------------
23410385        1d08cfd     United States   3               3
23410385        ec9c065     Mexico          3               3
23410385        a41b19c     France          3               3
------------------------------------------------------------------------
30285132        d331b33     Chile           2               4
30285132        1d08cf2     Peru            2               4
30285132        a750bff     Chile           2               4
30285132        d742bb5     Peru            2               4
------------------------------------------------------------------------
...

我需要存储的两列分别是 ARTICLE_ID 然后 COUNTRY_NAME。看看上面的 table 如果我们取 ARTICLE_ID 30522143 我们会有 14 USER_ID 因为它们都是 Singapore 那么 HAS_REPEATED_COUNTRY 的值将是 1.

ARTICLE_ID 30522139 的情况下,我们将有两个子桶,一个用于包含 2 USER_IDUnited States 和另一个子桶(Canada) 包含 1 USER_ID,这将导致与 United States 关联的所有用户的值都为 1,而与 [=33= 关联的唯一成员] 在 HAS_REPEATED_COUNTRY.

中的值为 0

因此 table 类似于:

ARTICLE_ID      USER_ID     COUNTRY_NAME    NUM_COUNTRIES   NUM_AUTHORS     HAS_REPEATED_COUNTRY
------------------------------------------------------------------------------------------------
30522143        ecf330d     Singapore       1               4               1
30522143        86b0faa     Singapore       1               4               1
30522143        d331b33     Singapore       1               4               1
30522143        d331b33     Singapore       1               4               1
------------------------------------------------------------------------------------------------
30522139        1d08cfd     United States   2               3               1
30522139        ec9c065     Canada          2               3               0
30522139        a750bff     United States   2               3               1
------------------------------------------------------------------------------------------------
23410385        1d08cfd     United States   3               3               0
23410385        ec9c065     Mexico          3               3               0
23410385        a41b19c     France          3               3               0
------------------------------------------------------------------------------------------------
30285132        d331b33     Chile           2               4               1
30285132        1d08cf2     Peru            2               4               1
30285132        a750bff     Chile           2               4               1
30285132        d742bb5     Peru            2               4               1
------------------------------------------------------------------------------------------------
...

有没有办法从前者中生成后者table?

您似乎想标记在给定文章中多次出现的国家/地区。如果是这样,您可以只使用 window 计数:

select 
    t.*,
    case when count(*) over(partition by article_id, country_name) > 1
        then 1 else 0
    end as has_repeated_country
from mytable t