SQL窗口函数和连接

SQL窗口函数和连接,sql,join,window-functions,Sql,Join,Window Functions,我的质询如下: 选择 类别名称、电影名称、租金计数 从…起 选择 c、 名称为类别名称,f.名称为电影名称, COUNTr.rental_日期按f.标题划分为租赁计数 从…起 c类 参加 电影类别fc ON fc.category\u id=c.category\u id 参加 fc上的胶片f。胶片id=f。胶片id 参加 i.film\u id上的库存i=f.film\u id 参加 i.inventory\u id=r.inventory\u id t1上的租金r 哪里 “动画”、“儿童”、

我的质询如下:

选择 类别名称、电影名称、租金计数 从…起 选择 c、 名称为类别名称,f.名称为电影名称, COUNTr.rental_日期按f.标题划分为租赁计数 从…起 c类 参加 电影类别fc ON fc.category\u id=c.category\u id 参加 fc上的胶片f。胶片id=f。胶片id 参加 i.film\u id上的库存i=f.film\u id 参加 i.inventory\u id=r.inventory\u id t1上的租金r 哪里 “动画”、“儿童”、“经典”、“喜剧”、“家庭”、“音乐”中的类别名称 订购人 1, 2 结果如下:

正如你所看到的,电影的标题是重复的,正如你已经知道的,它不应该重复。然而,我不明白为什么会这样

答案应该如上图所示


非常感谢您的帮助。

为什么会这样?这就是窗口函数所做的。它们不会减少行数。在现有行上添加新列,通常使用从多行收集的数据

您只需要一个聚合:

SELECT c.name AS category_name, f.title AS film_title, 
       COUNT(r.rental_date) as rental_count
FROM category c JOIN
     film_category fc
     ON fc.category_id = c.category_id JOIN
     film f
     ON fc.film_id = f.film_id JOIN
     inventory i
     ON i.film_id = f.film_id JOIN
     rental r
     ON i.inventory_id = r.inventory_id
WHERE c.category_name IN ('Animation', 'Children', 'Classics', 'Comedy', 'Family', 'Music')
GROUP BY 1, 2

其中一个连接是将行相乘,每次取出一行,看看是哪个。如果不使用group by,租借可能会导致问题,而且每部影片也可能有多个类别必须在最外层的select子句后放置distinct。@KoushikRoy OP不应在不了解返回多行的原因的情况下执行distinct操作:同意,抱歉,我假设OP知道自己的数据。您没有显示真正的查询。您显示的查询无效。缺少一个GROUP BY子句。感谢所有帮助回答我问题的人!你们是最棒的!