MYSQL GROUP BY 每个 ID 的最常见值

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

我有以下 2 个表:销售和菜单。 销售表

客户 ID 产品_id
A 1
A 2
A 2
A 3
A 3
A 3
B 1
B 1
B 3
B 3
B 2
B 2
C 3
C 3
C 3

菜单表

产品_id 产品名称
1 寿司
2 咖喱
3 拉面

**我的问题陈述是:** 哪个商品最受每位顾客欢迎。

所以我期待以下输出。

客户 ID 产品名称
A 拉面
B 寿司
C 拉面

我尝试过以下查询:

SELECT s.customer_id, m.product_name,
       (SELECT count(s.product_id) as freq
        from sales
        GROUP BY product_id
        ORDER BY freq DESC
        LIMIT 1) as maxFreq
from sales s
INNER JOIN menu m
  ON s.product_id = m.product_id
GROUP BY s.customer_id, s.product_id;

我无法在 maxfreq 上应用 group by,因为它是内部查询。否则我的工作就完成了。

sql mysql group-by
1个回答
0
投票

您可以使用排名查询,使用 ROW_NUMBER() 函数对每个客户的产品进行排名,然后从结果中提取rank=1 以获得所需的结果。通过此查询,您还可以通过将 1 更新为 2 等来找到排名 2 等。

SELECT 
    customer_id, 
    product_name
FROM (
    SELECT 
        s.customer_id, 
        m.product_name,
        COUNT(s.product_id) AS freq,
        ROW_NUMBER() OVER (PARTITION BY s.customer_id ORDER BY COUNT(s.product_id) DESC) AS rank
    FROM sales s
    INNER JOIN menu m 
    ON s.product_id = m.product_id
    GROUP BY s.customer_id, s.product_id
) AS ranked
WHERE rank = 1;
© www.soinside.com 2019 - 2024. All rights reserved.