我正在尝试制定 SQL 以列出 MySQL 或 SQL Server 上每个月的前 5 个租金。该数据库是Sakila Sample 数据库,并且该表是出租的。这是我的数据库客户端 (Navicat Premium) 中的前几行:
我想从rental_date 字段中获取月份。
每部电影都有一个唯一的inventory_id。
到目前为止,我有这个:
SELECT
MONTH( rental_date ) AS month,
inventory_id,
COUNT ( inventory_id ) AS no_of_rentals
FROM
rental
GROUP BY
MONTH ( rental_date ),
inventory_id
HAVING
COUNT ( inventory_id ) > 1
ORDER BY
MONTH ( rental_date ),
inventory_id;
不幸的是,这会返回所有每月租借超过一部的电影,这不是我想要的。
我希望看到更多类似的东西:
month inventory_id no_of_rentals
_________________________________
April 367 5
April 98 4
(3 more rows)
May 144 5
May 32 5
(3 more rows)
etc...
如果您能获得电影标题,则可获得奖励积分!
谢谢!
抢
更新:
感谢 Dominique Boucher 的回答。
这是我完成的查询:
WITH cte AS (
SELECT
MONTH(rental_date) rental_month_no,
DATENAME(month, rental_date) rental_month,
inventory_id,
COUNT( inventory_id ) no_of_rental,
ROW_NUMBER( ) OVER ( PARTITION BY MONTH(rental_date) ORDER BY COUNT( inventory_id ) DESC) Rank
FROM
rental
GROUP BY
MONTH(rental_date),
DATENAME(month, rental_date),
inventory_id
HAVING COUNT( inventory_id ) > 1
)
SELECT
rental_month,
cte.inventory_id,
title,
no_of_rental,
rank
FROM
cte
JOIN inventory ON cte.inventory_id = inventory.inventory_id
JOIN film ON inventory.film_id = film.film_id
WHERE
Rank < 6
ORDER BY rental_month_no, no_of_rental DESC;
我添加了代码来获取标题和有限的结果,这些电影在一个月内租用了不止一次。
以下是 Navicat 中的结果: