我正在尝试解决以下关于codewars的SQL问题:编写一个SQL查询来检索租电影最多的前5名客户,不包括至少租了一部电影的客户,评级为“NC-17”。禁止子查询使任务变得更好奇-您只能使用select一次
这就是我所尝试的:
select customer.customer_id,
first_name||' '||last_name as full_name,
count(*) as total_rentals
from customer
inner join rental on customer.customer_id = rental.customer_id
inner join inventory on rental.inventory_id = inventory.inventory_id
right join film on inventory.film_id = film.film_id
where film.rating !='NC-17'
group by customer.customer_id,first_name||' '||last_name
order by count(*)desc,last_name
limit 5
问题是,上面只排除了电影评级为NC-17的行。我需要排除那些看过NC-17级别电影的人。我是有限的,因为挑战只允许我使用一次选择,所以我不能使用子查询
1条答案
按热度按时间weylhg0b1#
您希望选择客户及其电影计数。但你必须排除某些电影的客户。您不能排除
WHERE
子句中的电影,因为这样您就不知道哪些客户租用了这些电影,哪些没有。因此,连接这些表,聚合数据,以便为每个客户获取一行,然后在HAVING
子句中筛选聚合结果。最后对结果进行排序,选出前五名。然后,对于那些“前n”查询,总是存在与领带的问题。如果有两个或多个客户拥有相同的前5位租用电影数量,该怎么办?然后你可以决定从前5到n任意选择5个客户或选择捆绑客户,因此可能不仅得到五个,但有时六个,七个或更多。相应地使用
5 ROWS ONLY
或5 ROWS WITH TIES
。