我有一个巨大的点击流数据,我可以提取timestamp,user_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 个月的数据。
假设你知道如何聚合你的数据如下:
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_AGG 和 OBJECT_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 |