with tbl as
(
select [Week], Client
from (values (1, 'a'),
(1, 'b'),
(1, 'c'),
(2, 'f'),
(2, 'a'),
(3, 'q'),
(3, 'y'),
(3, 'c')) as tbl ([Week], Client)
)
select tbl.[Week], count(distinct t1.Client)
from tbl
inner join tbl t1
on tbl.[Week] >= t1.[Week]
group by tbl.[Week]
Запрос выдает уникальные значения накопленным итогом.
Но понять логику его выполнения не могу, особенно с inner join (объяснять как работает inner join не нужно).
Может кто-нибудь подробно описать, что делает запрос?
Если в двух словах - это тенденция роста уникальных клиентов по неделям. Гуглить - "Нарастающий итог". Фактически к первой неделе джойнятся записи за первую неделю, ко второй - за первую и вторую и т.д. согласно условию tbl.[Week] >= t1.[Week]
Каждый клиент джойнится с клиентами текущей и предыдущей недели. Так за 1 неделю будет 9 клиентов! Потом группируются по tbl.Week, чтобы получить уникальные недели. По каждой недели агрегация клиентов - сумма уникальных клиентов. За счёт подсчёта уникальных первый джойн корректируется и получаем 3 клиента вместо 9