如何创建键值对或 2 组列表返回项目 ID 和相应的 sql 中的购买数量(或更具体的雪花)?

问题描述 投票:0回答:1

我有一个巨大的点击流数据,我可以提取timestampuser_ids对应的item_ids客户点击。

我正在尝试创建一个数据集,该数据集将在每一行上具有唯一的客户 ID(user_id),另一列具有键:值对,为我提供项目列表和相应项目被点击的次数,就像 python 字典(或者这可以在两列中,其中包含项目和相应的点击次数,作为从最频繁到最少的排序列表)。

举个例子:

USER_ID CLICKED_ITEMS
用户1 item3: 20, item2: 10, item1: 5
用户2 item1: 10, item2: 1, item3: 1
用户3 项目2:1
用户4 item1: 10, item2: 2

USER_ID CLICKED_ITEMS NUM_CLICKS
用户1 item3, item2, item1 20, 10, 5
用户2 item1, item2, item3 10, 1, 1
用户3 项目2 1
用户4 item1,item2 0, 2

这是否可能使用 SQL(尤其是 Snowflake 语法)? TIA

我试过了

SELECT user_id, using ARRAY_UNIQUE_AGG(item_id) AS clicked_items
FROM clickstream_table
GROUP_BY user_id

并获得了唯一的 user_id 和相应的项目列表,但不确定如何找到每个项目被点击的次数。我可以使用 pandas 轻松做到这一点,但不幸的是,由于仓库的大小和超时限制(3 小时限制),我什至无法提取 1 个月的数据。

sql snowflake-cloud-data-platform bigdata key-value clickstream
1个回答
0
投票

假设你知道如何聚合你的数据如下:

with data (user_id, item_name, click_count) as (
    select * from values
        ('user1', 'item1', 5),
        ('user1', 'item2', 10),
        ('user1', 'item3', 20),
        
        ('user2', 'item1', 10),
        ('user2', 'item2', 1),
        ('user2', 'item3', 1),

        ('user3', 'item2', 1),
        
        ('user4', 'item2', 10),
        ('user4', 'item2', 2)
)

你想要的结果可以用 ARRAY_AGGOBJECT_CONSTRUCT

select 
     user_id, 
     array_agg(object_construct(item_name, click_count)) within group (order by click_count desc) as clicked_items   
from data
group by 1
order by 1;

给:

USER_ID CLICKED_ITEMS
用户1 [{“item3”:20},{“item2”:10},{“item1”:5}]
用户2 [{“item1”:10},{“item2”:1},{“item3”:1}]
用户3 [ { "item2": 1 } ]
用户4 [{“item2”:10},{“item2”:2}]

或者如果你想让它看起来“完全”像你展示的那样,那么第二个选项可以用两个 LISTAGG

select 
     user_id, 
     listagg(item_name, ', ') within group (order by click_count desc) as clicked_items,
     listagg(click_count, ', ') within group (order by click_count desc) as num_clicks 
from data
group by 1
order by 1;

给予:

USER_ID CLICKED_ITEMS NUM_CLICKS
用户1 item3, item2, item1 20, 10, 5
用户2 item1, item2, item3 10, 1, 1
用户3 项目2 1
用户4 item2,item2 10, 2

好吧,第一个输出也可以用字符串连接创建。

select 
     user_id, 
     listagg(item_name||': '||click_count, ', ') within group (order by click_count desc) as clicked_items   
from data
group by 1
order by 1;

给:

USER_ID CLICKED_ITEMS
用户1 item3: 20, item2: 10, item1: 5
用户2 item1: 10, item2: 1, item3: 1
用户3 项目2:1
用户4 item2: 10, item2: 2
© www.soinside.com 2019 - 2024. All rights reserved.