Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нарастающий итог уникальных значений.  [new]
SashaKh
Member

Откуда:
Сообщений: 12
Добрый день.

Подскажите, как можно подсчитать уникальные значения нарастающим итогом? Не могу совсем правильно сформулировать вопрос, покажу на примере:

Таблица вида:
WeekClient
1a
1b
1c
2f
2a
3q
3y
3c


В результате хочу (но не могу) получить
WeekResult
13
24
36


Тоесть за первую неделю мы имеем 3 уникальных клиента, за первую и вторую недели - 4 уникальных клиента, за первую, вторую, третью недели мы имеем 6 уникальных клиентов.

Буду благодарен залюбой совет или пример.
17 апр 15, 18:33    [17531052]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 946
SashaKh, версия сервера какая? Или надо максимально независимо от версии?
17 апр 15, 18:35    [17531065]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
SashaKh
Member

Откуда:
Сообщений: 12
Версия Microsoft SQL Server 2008 R2 (SP2)
17 апр 15, 18:37    [17531075]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
Добрый Э - Эх
Guest
SashaKh,

делать через двухуровневый запрос. на первом уровне (во вложенном запросе) пометить первые вхождения значений (row_number() over()), на втором уровне (во внешнем запросе) посчитать накопительный COUNT() OVER() или SUM() OVER()
17 апр 15, 18:40    [17531079]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
Добрый Э - Эх
Guest
SashaKh
Версия Microsoft SQL Server 2008 R2 (SP2)
накопительные sum | count в этой версии ещё не доступны, поэтому выносим вычисление в [CROSS | OUTER]apply-подзапрос. :)
17 апр 15, 18:41    [17531085]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
SashaKh
Member

Откуда:
Сообщений: 12
Добрый Э - Эх,

Если не затруднит, можно пример запроса, т.к. не силен в SQL.
17 апр 15, 18:44    [17531093]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 946
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]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 946
Хотя, если подумать, все еще проще :)

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]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
SashaKh
Member

Откуда:
Сообщений: 12
Minamoto,

Спасибо!!! Все работает.


Чисто ради интереса, а если бы добавилось третье условие (например страна клиента), логика таже?
17 апр 15, 19:03    [17531145]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
SashaKh
Member

Откуда:
Сообщений: 12
Minamoto,

Еще раз спасибо. По поводу третьего условия, его просто надо будет добавить в условия inner join.
17 апр 15, 19:18    [17531196]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3606
Minamoto
Хотя, если подумать, все еще проще :)

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]


Мне кажется задача может быть решена за один скан без самоджойна, нужно немного изменить скрипты, которые обсуждали здесь. http://www.sql.ru/forum/1146528/okonnyy-distinct-count
17 апр 15, 19:31    [17531259]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог уникальных значений.  [new]
SashaKh
Member

Откуда:
Сообщений: 12
a_voronin,

Я видел эту темку, но не смог применить к своей задачеке...
17 апр 15, 20:15    [17531412]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить