SQL查询:电影租赁场景下获取并列最高值的所有记录
解决方案
你可以通过**CTE(公共表表达式)**结合DENSE_RANK()函数实现需求,具体如下:
最终SQL语句
WITH UserRentalCounts AS ( SELECT cust.email, COUNT(DISTINCT inv.mov_id) AS Rented_Count FROM cust JOIN rent ON rent.cust_id = cust.cust_id JOIN inv ON inv.inv_id = rent.inv_id JOIN mov ON mov.mov_id = inv.mov_id WHERE rent.rent_date BETWEEN '2022-09-01' AND '2022-09-30' -- 修正:9月无31日,避免日期过滤错误 GROUP BY cust.email ), RankedUsers AS ( SELECT email, DENSE_RANK() OVER (ORDER BY Rented_Count DESC) AS rental_rank FROM UserRentalCounts ) SELECT email FROM RankedUsers WHERE rental_rank = 1;
逻辑说明
统计用户租赁数
UserRentalCountsCTE复用你原有的统计逻辑,修正了日期边界错误,计算出每个用户在2022年9月租赁的唯一电影数量。为用户排名
RankedUsersCTE使用DENSE_RANK()函数,按租赁数量降序为用户排名。DENSE_RANK()的特性是:并列记录会获得相同排名,且后续排名不会跳跃,完美适配并列第一的场景。筛选排名第一的用户
最后只选择rental_rank = 1的记录,即可得到所有租赁数量最多的用户邮箱。
额外提示
如果想更精准匹配整个9月的租赁记录,可使用DATE_TRUNC函数替代日期区间判断(以PostgreSQL为例):
WHERE DATE_TRUNC('month', rent.rent_date) = '2022-09-01'
这种写法能避免手动输入月末日期的错误。
内容的提问来源于stack exchange,提问作者Student_OKIE
相关产品推荐
相关产品推荐

