Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
SashaKh Member Откуда: Сообщений: 12 |
Добрый день. Подскажите, как можно подсчитать уникальные значения нарастающим итогом? Не могу совсем правильно сформулировать вопрос, покажу на примере: Таблица вида:
В результате хочу (но не могу) получить
Тоесть за первую неделю мы имеем 3 уникальных клиента, за первую и вторую недели - 4 уникальных клиента, за первую, вторую, третью недели мы имеем 6 уникальных клиентов. Буду благодарен залюбой совет или пример. |
||||||||||||||||||||||||||||
17 апр 15, 18:33 [17531052] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
SashaKh, версия сервера какая? Или надо максимально независимо от версии? |
17 апр 15, 18:35 [17531065] Ответить | Цитировать Сообщить модератору |
SashaKh Member Откуда: Сообщений: 12 |
Версия Microsoft SQL Server 2008 R2 (SP2) |
17 апр 15, 18:37 [17531075] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
SashaKh, делать через двухуровневый запрос. на первом уровне (во вложенном запросе) пометить первые вхождения значений (row_number() over()), на втором уровне (во внешнем запросе) посчитать накопительный COUNT() OVER() или SUM() OVER() |
17 апр 15, 18:40 [17531079] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
|
||
17 апр 15, 18:41 [17531085] Ответить | Цитировать Сообщить модератору |
SashaKh Member Откуда: Сообщений: 12 |
Добрый Э - Эх, Если не затруднит, можно пример запроса, т.к. не силен в SQL. |
17 апр 15, 18:44 [17531093] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
SashaKh, у меня как то так получилось: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) ), tbl_gr as ( select [Week], count(distinct Client) as new_Clients from tbl where not exists (select * from tbl t2 where tbl.Client = t2.Client and tbl.[Week] > t2.[Week]) group by [Week] ) select t1.[Week], sum(t2.new_Clients) from tbl_gr t1 inner join tbl_gr t2 on t1.[Week] >= t2.[Week] group by t1.[Week] |
17 апр 15, 18:46 [17531096] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
Хотя, если подумать, все еще проще :)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] |
17 апр 15, 19:01 [17531137] Ответить | Цитировать Сообщить модератору |
SashaKh Member Откуда: Сообщений: 12 |
Minamoto, Спасибо!!! Все работает. Чисто ради интереса, а если бы добавилось третье условие (например страна клиента), логика таже? |
17 апр 15, 19:03 [17531145] Ответить | Цитировать Сообщить модератору |
SashaKh Member Откуда: Сообщений: 12 |
Minamoto, Еще раз спасибо. По поводу третьего условия, его просто надо будет добавить в условия inner join. |
17 апр 15, 19:18 [17531196] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Мне кажется задача может быть решена за один скан без самоджойна, нужно немного изменить скрипты, которые обсуждали здесь. https://www.sql.ru/forum/1146528/okonnyy-distinct-count |
||
17 апр 15, 19:31 [17531259] Ответить | Цитировать Сообщить модератору |
SashaKh Member Откуда: Сообщений: 12 |
a_voronin, Я видел эту темку, но не смог применить к своей задачеке... |
17 апр 15, 20:15 [17531412] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |