SQL. Агрегативные подзапросы и оконные функции

Онлайн площадки для тренировки написания SQL запросов online

http://sqlfiddle.com/

https://sqliteonline.com/

Материалы по join

Статья с описанием и примерами https://shra.ru/2017/09/sql-join-v-primerakh-s-opisaniem/

Материалы по оконным функциям

https://www.fastreport.ru/ru/blog/show/window-functions-tsql-part2/

https://tproger.ru/translations/sql-window-functions/

https://khashtamov.com/ru/window-functions-sql/

Примеры запросов

По таблице данных

Запросы на получение значения vol по клиенту за последний год



--1
SELECT customer, max(year), vol FROM Sales_table group by customer 

--2
--можно использовать в подзаросе значения из таблице основного запроса
SELECT customer, year, vol from Sales_table as s
where year=(SELECT  max(year) FROM Sales_table group by customer HAVING customer=s.customer ) 

--3
--inner join  можно использовать как фильтр и ничего не выводить из него
SELECT s.customer, year, vol from Sales_table as s
INNER JOIN (SELECT customer, max(year) as maxear FROM Sales_table group by customer) as t2 on s.customer=t2.customer and s.year=t2.maxear
;
--4
--использование left join  для того чтобы найти часть таблицы, не связаннцю с другой таблицей
SELECT s.customer, year, vol from Sales_table as s
LEFT JOIN (SELECT customer, max(year) as maxear FROM Sales_table group by customer) as t2 on s.customer=t2.customer and s.year=t2.maxear
WHERE t2.maxear is  NULL




--5
--запрос для вывода данных за последний и предпоследний год
SELECT s.customer, year, vol, tt.vol2 from Sales_table as s
INNER JOIN (SELECT customer, max(year) as maxear FROM Sales_table group by customer) as t2 on s.customer=t2.customer and s.year=t2.maxear
left join 
(
	SELECT s.customer, vol as vol2 from Sales_table as s
	INNER JOIN (SELECT customer, max(year) as maxear FROM Sales_table group by customer) as t2
  												on s.customer=t2.customer and s.year=t2.maxear-1
) as tt on s.customer=tt.customer



Пример с оконными функциями

select t1.customer, t1.year,t1.vol, t2.vol  from (SELECT customer, vol, year,  ROW_NUMBER() OVER (Partition BY customer order by year DESC) maxyear1 FROM Sales_table ) t1
JOIN (SELECT customer, vol, year,  ROW_NUMBER() OVER (Partition BY customer order by year DESC) maxyear1 FROM Sales_table ) t2
	on t1.maxyear1=1 and t1.customer=t2.customer and t2.maxyear1=2