繁体   English   中英

SQL window function 并加入

[英]SQL window function and joins

我的查询如下:

SELECT 
    category_name, film_title, rental_count
FROM
    (SELECT 
        c.name AS category_name, f.title AS film_title, 
        COUNT(r.rental_date) OVER (PARTITION BY f.title) 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) t1
WHERE 
    category_name IN ('Animation', 'Children', 'Classics', 'Comedy', 'Family', 'Music')
ORDER BY 
    1, 2

结果如下:

在此处输入图像描述

如您所见,电影的标题重复了,正如您已经知道的那样,它不应该重复。 但是,我不明白为什么会这样?

在此处输入图像描述

答案其实应该如上图。

非常感谢任何帮助。

为什么会这样? 这就是 window 函数的作用。 它们不会减少行数。 在现有行上添加新列(通常是从多行收集的数据)。

您只需要一个聚合:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM