【问题标题】:Get Item's favorite count from user's favorite itemset using SQL when field is sparse当字段稀疏时,使用 SQL 从用户最喜欢的项目集中获取项目的最喜欢计数
【发布时间】:2021-11-27 12:26:43
【问题描述】:

有 2 个表,Item 和 User。

  • 项目(ID)
  • 用户(id,favorite_itemset)

例如:

物品

id
11
22
33

用户

id favorite_itemset
A [22, 33]
B [22]

我想要如下结果。

item id favorite count
11 0
22 2
33 1

由于 favorite_itemset 字段很稀疏,而 User 表很大。有没有比使用 UNNEST 的方法? (快速)

任何帮助将不胜感激! 感谢您阅读本文。

【问题讨论】:

  • 预期结果表很棒。不能用同样的方式呈现表格数据吗?
  • 现在看起来好多了!

标签: sql apache-spark-sql presto


【解决方案1】:

您可以使用UNNEST 将数组扩展为关系,然后按项目ID 分组并与项目连接:

WITH item(id) AS
(
  VALUES
        (11),
        (22),
        (33)
), 
user(id,    favorite_itemset) AS
(
  VALUES
        ('A',   ARRAY[22, 33]),
        ('B',   ARRAY[22])
)
  


SELECT id,
    coalesce(cnt, 0) as favorite_count -- turn nulls into zeroes
FROM item 
LEFT OUTER JOIN 
    (SELECT item_id,
         count(*) AS cnt
    FROM USER
    CROSS JOIN UNNEST(favorite_itemset) AS t(item_id)
    GROUP BY  item_id )
    ON id = item_id 

输出:

id favorite_count
11 0
22 2
33 1

【讨论】:

  • 感谢您的回答!也许可以迭代:对于每个用户,只检查一次 favorite_itemset?因为 favorite_itemset 数据稀疏,用户表很大..
  • @sngjuk 你检查了这个查询的性能。也许它已经足够好了?
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2018-11-26
相关资源
最近更新 更多