分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0
Posted
技术标签:
【中文标题】分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0【英文标题】:Bucketing Data, If Bucket Size Greater Then 1 Set Value To 1 Else 0 【发布时间】:2020-08-31 21:22:34 【问题描述】:我正在使用snowflake
尝试基于两列存储行,如果该存储桶大小大于 1,那么我需要一些新列的值为 1,否则我会将其设置为 0。它类似于NTILE()
,只是我需要它是动态的。
我的表格如下所示:
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
。查看上表,如果我们采用ARTICLE_ID
30522143
,我们将拥有1
桶4
USER_ID
,因为它们都是Singapore
,那么HAS_REPEATED_COUNTRY
的值将是1。
在ARTICLE_ID
30522139
的情况下,我们将有两个子存储桶一个用于United States
,其中包含2
USER_ID
s,另一个子存储桶(Canada)
包含1
USER_ID
,这将导致所有与United States
关联的用户的值都为1
,而与Canada
关联的唯一成员在HAS_REPEATED_COUNTRY
中的值为0
。
因此表格类似于:
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
------------------------------------------------------------------------------------------------
...
有没有办法从前者生成后者的表?
【问题讨论】:
应该是一个简单的Windowed Aggregate:case when count(*) over (partition by ARTICLE_ID, COUNTRY_NAME) > 1 then 1 else 0 end
【参考方案1】:
您似乎想为给定文章标记多次出现的国家/地区。如果是这样,您可以只使用窗口计数:
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
【讨论】:
以上是关于分桶数据,如果桶大小大于 1,则将值设置为 1,否则为 0的主要内容,如果未能解决你的问题,请参考以下文章