问题描述
task 是为了
根据支出返回前 5 名客户 ID 及其排名 每个商店。
只有 2 张桌子 - 付款和客户。一共有2家店。
对于 store_id = 2,rank() 给出重复的 1,2,3,4,5 值,即 6。我不知道如何用 sql 代码选择 5。因为它实际上是 6 - 我不能“限制 5”
sqlfiddle 是 here。我不能让它在 sqlfiddle 中执行 row_number()。
我自己的查询:
with help2 as(
select
store_id,customer.customer_id,sum(amount) as revenue
from customer inner join payment on
customer.customer_id = payment.customer_id
where store_id = 2
group by
customer.customer_id
order by revenue desc)
select
store_id,customer_id,revenue,rank() over(order by revenue desc) as ranking2
from help2
order by ranking2 limit 6 -- i dont think there should be limit 6,this is hard coding
预期的答案是:
store_id customer_id revenue ranking
2 526 221.55 1
2 178 194.61 2
2 137 194.61 2
2 469 177.60 3
2 181 174.66 4
2 259 170.67 5
解决方法
简短的回答是使用DENSE_RANK()
,而不是RANK()
。这将为您提供与链接练习的示例输出相匹配的正确排名数字。
来自What’s the Difference Between RANK and DENSE_RANK in SQL?:
与 DENSE_RANK
不同,RANK
在排名相同后跳过位置。跳过的位置数量取决于有多少行具有相同的排名。例如,玛丽和丽莎销售的产品数量相同,都排在第 2 位。使用RANK
,下一个位置是#4;使用 DENSE_RANK
,下一个位置是 #3。
WITH CustomerSpending AS (
SELECT customer_id,SUM(amount) as revenue
FROM payment
GROUP BY customer_id
),CustomerSpendingRanking AS (
SELECT customer.store_id,customer.customer_id,CustomerSpending.revenue,DENSE_RANK() OVER (PARTITION BY customer.store_id ORDER BY CustomerSpending.revenue DESC) as ranking
FROM customer
JOIN CustomerSpending
ON customer.customer_id = CustomerSpending.customer_id
)
SELECT store_id,customer_id,revenue,ranking
FROM CustomerSpendingRanking
WHERE ranking < 6;