Функция окна 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