我有以下 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,因为它是内部查询。否则我的工作就完成了。
您可以使用排名查询,使用 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;