由于您在问题中提供了所需的输出,因此我设法使用示例数据重新创建了您的案例。
为了达到最终的结果,我已经完成了你提到的所有步骤:统计只喜欢一种饮料的人,统计只喜欢一种食物的人然后统计喜欢饮料和食物的人。
以下是示例数据和我采取的步骤,
#sample data for food
WITH food AS(
SELECT 1 AS user_ids, "hamburguer" AS foods UNION ALL
SELECT 1 AS user_ids, "hamburguer" AS foods UNION ALL
SELECT 2 AS user_ids, "hamburguer" AS foods UNION ALL
SELECT 2 AS user_ids, "pizza" AS foods UNION ALL
SELECT 2 AS user_ids, "pizza" AS foods UNION ALL
SELECT 3 AS user_ids, "chicken" AS foods
),
#sample data for drink
drink AS(
SELECT 1 AS user_ids, "coke" AS drinks UNION ALL
SELECT 2 AS user_ids, "coke" AS drinks UNION ALL
SELECT 2 AS user_ids, "coke" AS drinks UNION ALL
SELECT 4 AS user_ids, "coke" AS drinks UNION ALL
SELECT 5 AS user_ids, "coke" AS drinks
),
#count how many people like each type of food
count_foods AS (
SELECT COUNT(foods) AS count_foods, foods FROM food GROUP BY foods
),
#count how many people like each type of drink
count_drinks AS(
SELECT COUNT(drinks) AS count_drinks, drinks FROM drink GROUP BY drinks
),
#making all the possible combinations between foods and drinks with CROSS JOIN
food_drink_only AS (
SELECT foods, drinks, count_foods, count_drinks FROM count_foods a CROSS JOIN count_drinks b
),
#people who like one food and a drink, for ex.: user_ids = 1 likes hamburguer and coke
like_both AS (
SELECT COUNT(user_ids) AS count_both, foods, drinks FROM (SELECT DISTINCT user_ids, foods FROM food)
INNER JOIN (SELECT DISTINCT user_ids, drinks FROM drink) USING(user_ids) GROUP BY 2,3
)
#Using left join with foods and drinks as primary keys because all the combinations (fodds, drinks) came from the CROSS JOIN
#and are in the left table
SELECT a.foods,a.drinks,a.count_foods,a.count_drinks, b.count_both FROM food_drink_only a
LEFT JOIN like_both b ON a.foods = b.foods AND a.drinks=b.drinks
还有输出,
Row foods drinks count_foods count_drinks count_both
1 hamburguer coke 3 5 2
2 pizza coke 2 5 1
3 chicken coke 1 5 null
首先,请注意CROSS JOIN 为我们提供了foods 和drinks 之间的所有可能组合。因此,在创建最终输出时使用LEFT JOIN。然后,注意like_both表中会有2个喜欢可乐和汉堡的用户,1个喜欢可乐和比萨的用户,0个喜欢可乐和鸡肉的用户。出于这个原因,foods 和 drinks 字段被用作主键来连接这个表和food_drink_only 表。因此,数据被放置在正确的食物和饮料组合中。