Функция окна SQL - как обрабатывать, поскольку не удалось сгруппировать по

Это моя первая публикация здесь. Я спокойно просматривал форум в течение нескольких месяцев.

Я пытаюсь показать название категории, квартиль и количество названий на квартиль. Это мой код SQL:

SELECT name, standard_quartile, count
FROM 
     (SELECT c.name, ntile(4) over (order by f.rental_duration) as 
     standard_quartile, count(f.title) as count
     FROM category c
     JOIN film_category fc ON c.category_id=fc.category_id
     JOIN film f ON fc.film_id=f.film_id 
     WHERE c.name='Animation' OR c.name='Children' OR c.name='Classics' OR 
     <BR>c.name='Comedy' OR c.name='Family' OR c.name='Music'
     <BR>GROUP BY c.name, f.rental_duration
     <BR>) t1
GROUP BY 1, 2, 3
ORDER BY 1,2

Однако, поскольку я не могу группировать по квартилям (это оконная функция), он не отображает результаты так, как мне бы хотелось. Я думал, что если поместить его в подзапрос, это может сработать, но это не так. Я считаю, что другая проблема заключается в том, что один квартиль может иметь более одного числа продолжительности аренды.

Вот как это выглядит:

Анимация 1 12
Анимация 1 18
Анимация 2 9
Анимация 3 13
Анимация 4 14
Дети 1 12
Детей 2 9
Детей 2 15
Дети 3 13
Дети 4 11

Если кто-то может указать мне правильное направление или получить полезные советы, я был бы очень признателен.

Подсчет и группировка - это то, что я пытаюсь исправить. Если вы видите во фрагменте результатов отображения, есть два 1 квартиля для анимации и два 2 квартиля для детей. Там должен быть один из каждого. Но так как я не могу сгруппировать по квартилям, так как это оконная функция, она группируется по rental_duration.

Спасибо!:)

PS - вот как это должно выглядеть:

скриншот ожидаемых результатов запроса

2 ответа

Решение

Я думаю, что вы хотите group by только во внешнем запросе:

SELECT name, standard_quartile, count(*)
FROM (SELECT c.name,
             ntile(4) over (order by f.rental_duration) as standard_quartile
     FROM category c JOIN
          film_category fc
          ON c.category_id = fc.category_id JOIN
          film f
          ON fc.film_id = f.film_id 
     WHERE c.name IN ('Animation', 'Children', 'Classics', 'Comedy', 'Family', 'Music')
    ) t1
GROUP BY name, standard_quartile
ORDER BY name, standard_quartile;

Также обратите внимание на использование in для списка категорий.

select name , standard_quartile, sum(count)
    FROM(
    SELECT name, standard_quartile, count
    FROM 
         (SELECT c.name, ntile(4) over (order by f.rental_duration) as 
         standard_quartile, count(f.title) as count
         FROM category c
         JOIN film_category fc ON c.category_id=fc.category_id
         JOIN film f ON fc.film_id=f.film_id 
         WHERE c.name='Animation' OR c.name='Children' OR c.name='Classics' OR 
         <BR>c.name='Comedy' OR c.name='Family' OR c.name='Music'
         <BR>GROUP BY c.name, f.rental_duration
         <BR>) t1
    GROUP BY 1, 2, 3) t2
group by 1,2
ORDER BY 1,2
Другие вопросы по тегам