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

Онлайн площадки для тренировки написания SQL запросов online
Материалы по 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