:: Не фоксом единым
Как объединить 3 cte?
tata
Автор

Сообщений: 3508
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
Пробовала через запятые, не получилось, потому что запуталась в скобках
--Первый select
WITH customer_count_info AS (
SELECT
s.country,
c.customer_id,
COUNT(r.rental_id) AS num_films_rented,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY COUNT(r.rental_id) DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN payment p ON r.customer_id = p.customer_id and r.rental_id = p.rental_id
GROUP BY s.country, c.customer_id
)
SELECT
country,
customer_id,
num_films_rented
FROM customer_count_info
WHERE rn = 1
ORDER BY country;

-- второй select
with customer_rental_info AS (
SELECT
s.country,
c.customer_id,
sum(p.amount) AS max_sum_rented,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY COUNT(r.rental_id) DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN payment p ON r.customer_id = p.customer_id and r.rental_id = p.rental_id
GROUP BY s.country, c.customer_id
)
SELECT
country,
customer_id,
max_sum_rented
FROM customer_rental_info
WHERE rn = 1
ORDER BY country;
-- третий select
with customer_last_rental AS (
SELECT
s.country,
c.customer_id,
r.rental_date,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY r.rental_date DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
)
SELECT
country,
customer_id,
rental_date
FROM customer_last_rental
WHERE rn = 1
ORDER BY country;

-- НЕ РАБОТАЕТ, ПОТОМУ ЧТО ВНЕ WITH НЕ ЖИВЕТ
SELECT *
FROM
customer_count_info c1
left join customer_rental_info c2
ON c1.country = c2.country and c1.customer_id = c2.customer_id
left join customer_last_rental c3
ON c1.country = c3.country and c1.customer_id = c3.customer_id



Исправлено 1 раз(а). Последнее : tata, 24.04.24 23:19
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
sphinx

Сообщений: 31986
Откуда: Екатеринбург
Дата регистрации: 22.11.2006
Цитата:
-- НЕ РАБОТАЕТ, ПОТОМУ ЧТО ВНЕ WITH НЕ ЖИВЕТ

Таня, тебе этот запрос совсем не нужен. В задании нужно просто селекты написать, для трех ситуаций.
Но если очень хочется сделать то, чего не требовалось - вывести разноплановые итоги в сводном запросе - то:
- выводить не "звездочкой" (*) поля, а указать все же явно, причем для NULL-значений обернуть в функцию COALESCE().
- для именованных подзапросов не нужны селекты за ними, ты же их результаты не используешь в самом последнем (объединяющем запросе)
- если ну очень нужны селекты для отбора первой записи - так их тоже обернуть в именованные подзапросы и, соответсвенно, брать результаты уже из них.

С учетом всего вышесказанного получается минимум переделок:

--Первый select
WITH customer_count_info AS (
SELECT
s.country,
c.customer_id,
COUNT(r.rental_id) AS num_films_rented,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY COUNT(r.rental_id) DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN payment p ON r.customer_id = p.customer_id and r.rental_id = p.rental_id
GROUP BY s.country, c.customer_id
),
/*
SELECT
country,
customer_id,
num_films_rented
FROM customer_count_info
WHERE rn = 1
ORDER BY country;
*/
-- второй select
customer_rental_info AS (
SELECT
s.country,
c.customer_id,
sum(p.amount) AS max_sum_rented,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY COUNT(r.rental_id) DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN payment p ON r.customer_id = p.customer_id and r.rental_id = p.rental_id
GROUP BY s.country, c.customer_id
),
/*
SELECT
country,
customer_id,
max_sum_rented
FROM customer_rental_info
WHERE rn = 1
ORDER BY country;
*/
-- третий select
customer_last_rental AS (
SELECT
s.country,
c.customer_id,
r.rental_date,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY r.rental_date DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
)
/*
SELECT
country,
customer_id,
rental_date
FROM customer_last_rental
WHERE rn = 1
ORDER BY country;
*/
--РАБОТАЕТ, ЕСЛИ РАЗОБРАТЬСЯ, ЧТО ИСПОЛЬЗУЕТСЯ В ЭТОМ ЗАПРОСЕ.
SELECT c1.country, c.last_name, c.first_name,
coalesce(c1.num_films_rented, 0) as num_films_rented,
coalesce(c2.max_sum_rented, 0) as max_sum_rented,
c3.rental_date /* ----- тут тоже надо типа coalesce(c3.rental_date, cast(0 as date) ) as rental_date, ----- */
from customer_count_info c1
left join customer_rental_info c2 ON c1.country = c2.country and c1.customer_id = c2.customer_id
left join customer_last_rental c3 ON c1.country = c3.country and c1.customer_id = c3.customer_id
left join customer c on c1.customer_id=c.customer_id
where c1.rn=1 and c2.rn=1 and c3.rn=1
order by c1.country, c.last_name, c.first_name


P.S. На производстве будут запросы на порядок сложнее, я про то, что надо выбирать работу по силам.


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 25.04.24 06:52
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
tata
Автор

Сообщений: 3508
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
sphinx
Таня, тебе этот запрос совсем не нужен. В задании нужно просто селекты написать, для трех ситуаций.
Саш, как ты читаешь-то вообще? Через слово?
Для каждой страны определите и выведите одним SQL-запросом покупателей, которые попадают под условия...



Исправлено 2 раз(а). Последнее : tata, 25.04.24 07:51
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
tata
Автор

Сообщений: 3508
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
.



Исправлено 1 раз(а). Последнее : tata, 25.04.24 08:52
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
sphinx

Сообщений: 31986
Откуда: Екатеринбург
Дата регистрации: 22.11.2006
tata
sphinx
Таня, тебе этот запрос совсем не нужен. В задании нужно просто селекты написать, для трех ситуаций.
Саш, как ты читаешь-то вообще? Через слово?
Для каждой страны определите и выведите одним SQL-запросом покупателей, которые попадают под условия...

Одним запросом, но каждую ситуацию отдельно.
Написано не очень однозначно, но требуют один запрос для каждой ситуации.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
sphinx

Сообщений: 31986
Откуда: Екатеринбург
Дата регистрации: 22.11.2006
tata
sphinx
P.S. На производстве будут запросы на порядок сложнее, я про то, что надо выбирать работу по силам.
Ты мало того, что нетактичен, так еще и раздаешь советы, о которых тебя не просили. Нехорошо.

Мой хороший совет позволит тебе сэкономить время на те компании, в которым тебе точно будет очень сложно. Тут обижаться надо, а спасибо сказать.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
tata
Автор

Сообщений: 3508
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
Если кому надо backup, вышлю, он маленький, 700 кб.
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
PaulWist

Сообщений: 14762
Дата регистрации: 01.04.2004
Через запятую.

--Первый select
WITH customer_count_info AS (
SELECT
s.country,
c.customer_id,
COUNT(r.rental_id) AS num_films_rented,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY COUNT(r.rental_id) DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN payment p ON r.customer_id = p.customer_id and r.rental_id = p.rental_id
GROUP BY s.country, c.customer_id
)
,
-- второй select
with customer_rental_info AS (
SELECT
s.country,
c.customer_id,
sum(p.amount) AS max_sum_rented,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY COUNT(r.rental_id) DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
JOIN payment p ON r.customer_id = p.customer_id and r.rental_id = p.rental_id
GROUP BY s.country, c.customer_id
)
,
-- третий select
with customer_last_rental AS (
SELECT
s.country,
c.customer_id,
r.rental_date,
ROW_NUMBER() OVER (PARTITION BY s.country ORDER BY r.rental_date DESC) AS rn
FROM customer c
JOIN address a ON c.address_id = a.address_id
JOIN city g ON a.city_id = g.city_id
JOIN country s ON g.country_id = s.country_id
JOIN rental r ON c.customer_id = r.customer_id
)
SELECT *
FROM
customer_count_info c1
left join customer_rental_info c2
ON c1.country = c2.country and c2.rn = 1 and c1.customer_id = c2.customer_id
left join customer_last_rental c3
ON c1.country = c3.country and c3.rn = 1 and c1.customer_id = c3.customer_id
where c1.rn = 1

Но результат будет неправильный


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 25.04.24 11:26
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
sphinx

Сообщений: 31986
Откуда: Екатеринбург
Дата регистрации: 22.11.2006
Паша, ты мой запрос повторил.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
tata
Автор

Сообщений: 3508
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
PaulWist
Через запятую.

Но результат будет неправильный
Я так пробовала, не работает вообще.
SQL Error [42601]: ОШИБКА: ошибка синтаксиса (примерное положение: "with")
Позиция: 544


Позиция ошибки: line: 18 pos: 543 (около 2-го with, сразу после запятой)
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
tata
Автор

Сообщений: 3508
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
sphinx
Паша, ты мой запрос повторил.
Саша, твой запрос был совсем не такой.
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
PaulWist

Сообщений: 14762
Дата регистрации: 01.04.2004
Точку с запятой поставь перед with

;with


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
PaulWist

Сообщений: 14762
Дата регистрации: 01.04.2004
Версия ПГ какая??


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
tata
Автор

Сообщений: 3508
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
PaulWist
Версия ПГ какая??
Есть 16.2, есть Pro, тоже 16.2
Ratings: 0 negative/0 positive
Re: Как объединить 3 cte?
PaulWist

Сообщений: 14762
Дата регистрации: 01.04.2004
Пришли на почту, у меня правда 12.16, может поднимется.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 21 (Гостей: 21)

© 2000-2025 Fox Club 
Яндекс.Метрика