当字段稀疏时,使用 SQL 从用户最喜欢的项目集中获取项目的最喜欢计数
Get Item's favorite count from user's favorite itemset using SQL when field is sparse
有 2 个 table,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 字段稀疏,而用户 table 很大。有比使用 UNNEST 更好的方法吗? (急板)
任何帮助将不胜感激!
感谢您阅读本文。
您可以使用 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
有 2 个 table,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 字段稀疏,而用户 table 很大。有比使用 UNNEST 更好的方法吗? (急板)
任何帮助将不胜感激! 感谢您阅读本文。
您可以使用 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 |