Postgresql查询的问题,要求我只能使用select一次

rvpgvaaj  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(167)

我正在尝试解决以下关于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级别电影的人。我是有限的,因为挑战只允许我使用一次选择,所以我不能使用子查询

weylhg0b

weylhg0b1#

您希望选择客户及其电影计数。但你必须排除某些电影的客户。您不能排除WHERE子句中的电影,因为这样您就不知道哪些客户租用了这些电影,哪些没有。因此,连接这些表,聚合数据,以便为每个客户获取一行,然后在HAVING子句中筛选聚合结果。最后对结果进行排序,选出前五名。
然后,对于那些“前n”查询,总是存在与领带的问题。如果有两个或多个客户拥有相同的前5位租用电影数量,该怎么办?然后你可以决定从前5到n任意选择5个客户或选择捆绑客户,因此可能不仅得到五个,但有时六个,七个或更多。相应地使用5 ROWS ONLY5 ROWS WITH TIES

select 
  c.customer_id,
  c.first_name || ' ' || c.last_name as full_name,
  count(*) as total_rentals 
from customer c
inner join rental r on r.customer_id = c.customer_id
inner join inventory i on i.inventory_id = r.inventory_id
inner join film f on f.film_id = i.film_id 
group by c.customer_id
having count(*) filter (where f.rating = 'NC-17') = 0
order by count(*) desc
fetch first 5 rows with ties;

相关问题