如果 rank() 在 sql 中重复某些值,如何从 6 个值中选择前 5 个值?

问题描述

task 是为了

根据支出返回前 5 名客户 ID 及其排名 每个商店。

只有 2 张桌子 - 付款和客户。一共有2家店。

对于 store_id = 2,rank() 给出重复的 1,2,3,4,5 值,即 6。我不知道如何用 sql 代码选择 5。因为它实际上是 6 - 我不能“限制 5”

sqlfiddlehere。我不能让它在 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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...