Совсем другой подход с использованием CTE и некоторых оконных функций.Для этого не требуется 2 сканирования таблицы или треугольное соединение.
WITH VTE AS(
SELECT *
FROM (VALUES (2018,1,4000,5),
(2018,2,6000,4),
(2018,3,5000,3),
(2018,4,3000,2),
(2019,1,8000,1)) V([Year],[Quarter],sales, row_no)),
CTE AS(
SELECT Y.Year,
Q.Quarter,
V.sales,
V.row_no,
COUNT(CASE WHEN V.sales IS NOT NULL THEN 1 END) OVER (ORDER BY Y.[Year], Q.[Quarter]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Grp
FROM (VALUES(2018),(2019)) Y([Year])
CROSS JOIN (VALUES(1),(2),(3),(4)) Q([Quarter])
LEFT JOIN VTE V ON Y.[Year] = V.[Year] AND Q.[Quarter] = V.[Quarter])
SELECT C.[Year],
C.[Quarter],
MAX(C.sales) OVER (PARTITION BY C.Grp) AS Sales
FROM CTE C;
Это будет работать только на SQL Server 2012+ (так как ROWS BETWEEN
был представлен в SQL Server 2012), однако, мы надеемся,вы не используете 2008 - который полностью (почти) полностью не поддерживается.