SQL_Begin
/
Mikhailov_D_M_DZ4.sql
216 строк · 9.6 Кб
1--=============== МОДУЛЬ 5. РАБОТА С POSTGRESQL =======================================
2--= ПОМНИТЕ, ЧТО НЕОБХОДИМО УСТАНОВИТЬ ВЕРНОЕ СОЕДИНЕНИЕ И ВЫБРАТЬ СХЕМУ PUBLIC===========
3SET search_path TO public;4
5--======== ОСНОВНАЯ ЧАСТЬ ==============
6
7--ЗАДАНИЕ №1
8--Сделайте запрос к таблице payment и с помощью оконных функций добавьте вычисляемые
9--колонки согласно условиям:
10--Пронумеруйте все платежи от 1 до N по дате
11--Пронумеруйте платежи для каждого покупателя, сортировка платежей должна быть по дате
12--Посчитайте нарастающим итогом сумму всех платежей для каждого покупателя, сортировка должна
13--быть сперва по дате платежа, а затем по сумме платежа от наименьшей к большей
14--Пронумеруйте платежи для каждого покупателя по стоимости платежа от наибольших к меньшим
15--так, чтобы платежи с одинаковым значением имели одинаковое значение номера.
16--Можно составить на каждый пункт отдельный SQL-запрос, а можно объединить все колонки
17--в одном запросе.
18
19select customer_id, payment_id, payment_date,20ROW_NUMBER() OVER (ORDER BY payment_date) as Column_1,21ROW_NUMBER() OVER (PARTITION BY customer_id22ORDER BY payment_date) as Column_2,23SUM(amount) OVER (PARTITION BY customer_id24ORDER BY payment_date,amount) as Column_3,25dense_rank() over (PARTITION BY customer_id ORDER BY amount desc ) as Column_426from payment p27order by customer_id, Column_428
29
30--ЗАДАНИЕ №2
31--С помощью оконной функции выведите для каждого покупателя стоимость платежа и стоимость
32--платежа из предыдущей строки со значением по умолчанию 0.0 с сортировкой по дате.
33
34-- В ответе Ориентировался на скриншот.
35-- Если оствить сортировку только по дате - значения иные будут.
36select customer_id, payment_id, payment_date,37amount,38LAG(amount, 1, 0.0) OVER () AS last_amount39from payment p40order by customer_id, payment_id, payment_date41
42
43
44--ЗАДАНИЕ №3
45--С помощью оконной функции определите, на сколько каждый следующий платеж покупателя больше или меньше текущего.
46
47select customer_id, payment_id, payment_date,48amount,49amount - LEAD(amount, 1, 0.0) OVER () AS last_amount50from payment p51order by customer_id, payment_id, payment_date52
53
54--ЗАДАНИЕ №4
55--С помощью оконной функции для каждого покупателя выведите данные о его последней оплате аренды.
56
57select customer_id, payment_id, payment_date, amount58from payment59where payment_date in (SELECT MAX(payment_date) OVER (PARTITION BY customer_id ORDER BY payment_date desc ) FROM payment)60order by customer_id limit 1061
62
63--======== ДОПОЛНИТЕЛЬНАЯ ЧАСТЬ ==============
64
65--ЗАДАНИЕ №1
66--С помощью оконной функции выведите для каждого сотрудника сумму продаж за август 2005 года
67--с нарастающим итогом по каждому сотруднику и по каждой дате продажи (без учёта времени)
68--с сортировкой по дате.
69
70select staff_id,71payment_date,72sum_amount,73coalesce(SUM(sum_amount) OVER (PARTITION BY staff_id74ORDER BY payment_date::DATE),0) as "sum"75from (select staff_id ,76to_char(payment_date::DATE,'dd.mm.yyyy') AS "payment_date",77SUM(amount) as sum_amount78from payment p79group by staff_id, payment_date::DATE80having payment_date::DATE BETWEEN '01-08-2005 00:00:00' AND '31-08-2005 23:59:59' ) as tests81order by staff_id, payment_date82
83
84--ЗАДАНИЕ №2
85--20 августа 2005 года в магазинах проходила акция: покупатель каждого сотого платежа получал
86--дополнительную скидку на следующую аренду. С помощью оконной функции выведите всех покупателей,
87--которые в день проведения акции получили скидку
88
89select customer_id, payment_date, payment_number90from (select91customer_id,92payment_date,93ROW_NUMBER() OVER (ORDER BY payment_date) as payment_number94from payment p95where payment_date::DATE = '2005-08-20'96) as zapros97where to_char(payment_number, '000') LIKE '%00'98order by payment_number99
100
101--ЗАДАНИЕ №3
102--Для каждой страны определите и выведите одним SQL-запросом покупателей,
103-- которые попадают под условия:
104-- 1. покупатель, арендовавший наибольшее количество фильмов
105-- 2. покупатель, арендовавший фильмов на самую большую сумму
106-- 3. покупатель, который последним арендовал фильм
107
108
109
110-- Попытки в решение
111
112select * from customer c113
114select * from payment p115
116select customer_id, count(payment_id), sum(amount), MAX(payment_date)117from payment p118GROUP BY customer_id119order by customer_id desc limit 5120
121select * from country c122
123select concat(first_name,' ',last_name) as FIO, c3.country124from customer c125join address a on c.address_id = a.address_id126join city c2 on a.city_id = c2.city_id127join country c3 on c2.country_id = c3.country_id128join payment p on c.customer_id = p.customer_id129group by c3.country, concat(first_name,' ',last_name)130order by c3.country131
132
133-- Основной работаюющий код
134select concat(c3.first_name,' ', c3.last_name) as FIO ,135c1.country,136count(p.customer_id),137sum(p.amount),138max(p.payment_date)139from country c1140join city c2 on c1.country_id = c2.country_id141join address a on c2.city_id = a.city_id142join customer c3 on a.address_id = c3.address_id143join payment p on c3.customer_id = p.customer_id144group by c1.country, FIO145order by c1.country146
147-- Тесты (на работающий или пробные варианты решения задачи, которые было жалко удалять)
148select c1.country,149concat(c3.first_name,' ', c3.last_name) as FIO,150fio2
151from (select concat(first_name,' ',last_name) as FIO2152from customer c153join address a on c.address_id = a.address_id154join city c2 on a.city_id = c2.city_id155join country c3 on c2.country_id = c3.country_id156join payment p on c.customer_id = p.customer_id157group by c3.country, concat(first_name,' ',last_name)158having count(p.customer_id) in (select count(p.customer_id)159from country c1160join city c2 on c1.country_id = c2.country_id161join address a on c2.city_id = a.city_id162join customer c3 on a.address_id = c3.address_id163join payment p on c3.customer_id = p.customer_id164group by c1.country)) ted1,165country c1
166join city c2 on c1.country_id = c2.country_id167join address a on c2.city_id = a.city_id168join customer c3 on a.address_id = c3.address_id169join payment p on c3.customer_id = p.customer_id170group by c1.country, FIO, ted1.fio2171
172
173select concat(c.first_name,' ',c.last_name) as FIO, c3.country174from customer c175join address a on c.address_id = a.address_id176join city c2 on a.city_id = c2.city_id177join country c3 on c2.country_id = c3.country_id178join payment p on c.customer_id = p.customer_id179group by c3.country, concat(c.first_name,' ',c.last_name)180having count(DISTINCT p.customer_id) in (select count(DISTINCT p.customer_id)181from country c1182join city c2 on c1.country_id = c2.country_id183join address a on c2.city_id = a.city_id184join customer c3 on a.address_id = c3.address_id185join payment p on c3.customer_id = p.customer_id186group by c1.country)187order by c3.country188
189select count(DISTINCT p.customer_id) as FIO, c3.country190from customer c191join address a on c.address_id = a.address_id192join city c2 on a.city_id = c2.city_id193join country c3 on c2.country_id = c3.country_id194join payment p on c.customer_id = p.customer_id195group by c3.country, concat(c.first_name,' ',c.last_name)196having in (select count(DISTINCT p.customer_id)197from country c1198join city c2 on c1.country_id = c2.country_id199join address a on c2.city_id = a.city_id200join customer c3 on a.address_id = c3.address_id201join payment p on c3.customer_id = p.customer_id202group by c1.country)203order by c3.country204
205select concat(c3.first_name,' ', c3.last_name) as FIO,206c1.country,207count(p.customer_id),208sum(p.amount),209max(p.payment_date)210from country c1211join city c2 on c1.country_id = c2.country_id212join address a on c2.city_id = a.city_id213join customer c3 on a.address_id = c3.address_id214join payment p on c3.customer_id = p.customer_id215group by c1.country216order by c1.country217