Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Нарастающий итог по уникальности  [new]
Гость123
Guest
Есть таблица с данными.

Data          IdClient
01.01.07 1
01.01.07 2
02.01.07 2
02.01.07 3
03.01.07 3
03.01.07 4
04.01.07 5
04.01.07 6
04.01.07 7
05.01.07 10

Необходимо получить кол-во уникальных клиентов нарастающим итогом.

Т.е. 01.01.07 пришли клиенты 1 и 2

будет

Дата       Кол-во
01.01.07 2

02.01.07 пришли клиенты 2 и 3, но клиент 2 был 01.01.07, т.е. уникальных за этот день 1, прибавляем к предыдущему значению.

Дата       Кол-во
01.01.07 2
02.01.07 3

И т.д., в итоге должно получится

Дата       Кол-во
01.01.07 2
02.01.07 3
03.01.07 4
04.01.07 7
05.01.07 8

Помогите добрым советом
19 ноя 07, 11:41    [4932445]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
rwgret
Guest
select count(distinct IdClient) over(order by Data)
from ...
19 ноя 07, 11:54    [4932573]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
SQL> alter session set nls_date_format='dd-mm-yyyy';
 
Session altered
SQL> with tab as (select '01.01.07' dt, 1 IdClient
  2  from dual union all select '01.01.07',         2
  3  from dual union all select '02.01.07',         2
  4  from dual union all select '02.01.07',         3
  5  from dual union all select '03.01.07',         3
  6  from dual union all select '03.01.07',         4
  7  from dual union all select '04.01.07',         5
  8  from dual union all select '04.01.07',         6
  9  from dual union all select '04.01.07',         7
 10  from dual union all select '05.01.07',         10
 11  from dual
 12  )
 13  select dt "Дата", sum(count(IdClient)) over(order by dt) "Кол-во"
 14  from (
 15  select IdClient
 16           , min(dt) dt
 17  from tab
 18  group by IdClient) group by dt;
 
Дата      Кол-во
-------- ----------
01.01.07          2
02.01.07          3
03.01.07          4
04.01.07          7
05.01.07          8
 
SQL> 
19 ноя 07, 11:57    [4932605]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
Elic
Member

Откуда:
Сообщений: 29980
rwgret
count(distinct IdClient) over(order by Data)
distinct не работает в окне :)
19 ноя 07, 12:00    [4932637]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
Гость123
Guest
andrey_anonymous
SQL> alter session set nls_date_format='dd-mm-yyyy';
 
Session altered
SQL> with tab as (select '01.01.07' dt, 1 IdClient
  2  from dual union all select '01.01.07',         2
  3  from dual union all select '02.01.07',         2
  4  from dual union all select '02.01.07',         3
  5  from dual union all select '03.01.07',         3
  6  from dual union all select '03.01.07',         4
  7  from dual union all select '04.01.07',         5
  8  from dual union all select '04.01.07',         6
  9  from dual union all select '04.01.07',         7
 10  from dual union all select '05.01.07',         10
 11  from dual
 12  )
 13  select dt "Дата", sum(count(IdClient)) over(order by dt) "Кол-во"
 14  from (
 15  select IdClient
 16           , min(dt) dt
 17  from tab
 18  group by IdClient) group by dt;
 
Дата      Кол-во
-------- ----------
01.01.07          2
02.01.07          3
03.01.07          4
04.01.07          7
05.01.07          8
 
SQL> 


Спасибо, то что нужно!
19 ноя 07, 12:33    [4932961]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116175
andrey_anonymous
10   union all select '05.01.07',         10
 11  from dual
 


Если вместо этой строки будет

from dual union all select '05.01.07',         2

то вроде не работает ...
19 ноя 07, 12:42    [4933049]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
Elic
Member

Откуда:
Сообщений: 29980
dmidek
то вроде не работает ...
Это как интерпретировать этот нюанс, не освещённый автором. А пока имеет право на жизнь и принцип "Нет изменений - нет даты".
19 ноя 07, 12:52    [4933141]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
ps
Member

Откуда:
Сообщений: 503
"усложнение" предыдущего варианта для непрерывности даты
SQL> select	sd.dd "Date",
  2  		decode(dt,null,0,sum(count(IdClient)) over(order by dt)) "Count"
  3  from (
  4  	select	IdClient,
  5  		min(dt)		dt
  6  	from	(
  7  		select '01.01.07' dt, 1 IdClient from dual union all
  8  		select '01.01.07',    2 from dual union all
  9  		select '02.01.07',    2 from dual union all
 10  		select '02.01.07',    3 from dual union all
 11  		select '03.01.07',    3 from dual union all
 12  		select '03.01.07',    4 from dual union all
 13  		select '04.01.07',    5 from dual union all
 14  		select '04.01.07',    6 from dual union all
 15  		select '04.01.07',    7 from dual union all
 16  		select '05.01.07',    2 from dual union all
 17  		select '08.01.07',   10 from dual
 18  		) tab
 19  	group by IdClient
 20  	)
 21  	,(
 22  	select	to_date('31.12.2006','dd.mm.yyyy') + level	dd
 23  	from dual connect by level < 10
 24  	)	sd
 25  where	dt (+) = to_char(sd.dd,'dd.mm.yy')
 26  group	by dt,sd.dd
 27  order by sd.dd
 28  /

Date            Count
----------- ---------
01.01.2007          2
02.01.2007          3
03.01.2007          4
04.01.2007          7
05.01.2007          0
06.01.2007          0
07.01.2007          0
08.01.2007          8
09.01.2007          0

9 rows selected

SQL> 
19 ноя 07, 13:11    [4933298]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116175
ps
"усложнение" предыдущего варианта для непрерывности даты
Date            Count
----------- ---------
01.01.2007          2
02.01.2007          3
03.01.2007          4
04.01.2007          7
05.01.2007          0
06.01.2007          0
07.01.2007          0
08.01.2007          8
09.01.2007          0

9 rows selected

SQL> 


Если я правильно понимаю, вместо нулей должны быть семерки/восьмерка :-)
У нас же нарастающий итог ...
19 ноя 07, 13:15    [4933324]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
ps
"усложнение" предыдущего варианта для непрерывности даты

Не уверен что дата должна быть непрерывной...
Вот еще вариантик:
SQL> alter session set nls_date_format='dd-mm-yyyy';
 
Session altered
SQL> with tab as (select '01.01.07' dt, 1 IdClient
  2  from dual union all select '01.01.07',         2
  3  from dual union all select '02.01.07',         2
  4  from dual union all select '02.01.07',         3
  5  from dual union all select '03.01.07',         3
  6  from dual union all select '03.01.07',         4
  7  from dual union all select '04.01.07',         5
  8  from dual union all select '04.01.07',         6
  9  from dual union all select '04.01.07',         7
 10  from dual union all select '05.01.07',         2
 11  from dual union all select '08.01.07',         10
 12  from dual
 13  )
 14  select t.dt "Дата", (select count(distinct IdClient) from tab ts where ts.dt <=t.dt) "Кол-во"
 15  from
 16  (select distinct dt from tab) t
 17  ;
 
Дата      Кол-во
-------- ----------
01.01.07          2
02.01.07          3
03.01.07          4
04.01.07          7
05.01.07          7
08.01.07          8
 
6 rows selected
 
SQL> 
19 ноя 07, 13:34    [4933466]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
ps
Member

Откуда:
Сообщений: 503
dmidek
Если я правильно понимаю, вместо нулей должны быть семерки/восьмерка :-)
У нас же нарастающий итог ...

Да, перемудрил немного. DECODE в этом случае лишний. Хотел Даты без новых контактов выделить.

SQL> select	sd.dd "Date",
  2  		sum(count(IdClient)) over(order by sd.dd) "Count"
  3  from	(
  4  	select	IdClient,
  5  		min(dt)		dt
  6  	from	(
  7  		select '01.01.07' dt, 1 IdClient from dual union all
  8  		select '01.01.07',    2 from dual union all
  9  		select '02.01.07',    2 from dual union all
 10  		select '02.01.07',    3 from dual union all
 11  		select '03.01.07',    3 from dual union all
 12  		select '03.01.07',    4 from dual union all
 13  		select '04.01.07',    5 from dual union all
 14  		select '04.01.07',    6 from dual union all
 15  		select '04.01.07',    7 from dual union all
 16  		select '05.01.07',    2 from dual union all
 17  		select '08.01.07',   10 from dual
 18  		) tab
 19  	group by IdClient
 20  	)
 21  	,(
 22  	select	to_date('31.12.2006','dd.mm.yyyy') + level	dd
 23  	from dual connect by level < 10
 24  	)	sd
 25  where	dt (+) = to_char(sd.dd,'dd.mm.yy')
 26  group	by dt,sd.dd
 27  order by sd.dd
 28  /

Date            Count
----------- ---------
01.01.2007          2
02.01.2007          3
03.01.2007          4
04.01.2007          7
05.01.2007          7
06.01.2007          7
07.01.2007          7
08.01.2007          8
09.01.2007          8

9 rows selected

SQL> 
19 ноя 07, 14:26    [4933797]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116175
Я тоже придумал вариантик, немного похожий на метод
start_of_group

SQL> with tab as (select '01.01.07' dt, 1 IdClient from dual
  2      union all select '01.01.07',         2
  3      from dual union all select '02.01.07',         2
  4      from dual union all select '02.01.07',         3
  5      from dual union all select '03.01.07',         3
  6      from dual union all select '03.01.07',         4
  7      from dual union all select '04.01.07',         5
  8      from dual union all select '04.01.07',         6
  9      from dual union all select '04.01.07',         7
 10     from dual union all select '05.01.07',         2
 11     from dual union all select '08.01.07',         10
 12     from dual
 13     )
 14  select distinct dt, sum(gr) over(order by dt) "Count"
 15    from (select dt,
 16                 case
 17                   when dt =
 18                        first_value(dt) over(partition by IdClient) then
 19                    1
 20                   else
 21                    0
 22                 end as gr
 23            from tab)
 24   order by dt
 25  /
 
DT            Count
-------- ----------
01.01.07          2
02.01.07          3
03.01.07          4
04.01.07          7
05.01.07          7
08.01.07          8
 
6 rows selected
 
SQL> 
19 ноя 07, 15:03    [4934087]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
Гость123
Guest
dmidek
Я тоже придумал вариантик, немного похожий на метод
start_of_group

SQL> with tab as (select '01.01.07' dt, 1 IdClient from dual
  2      union all select '01.01.07',         2
  3      from dual union all select '02.01.07',         2
  4      from dual union all select '02.01.07',         3
  5      from dual union all select '03.01.07',         3
  6      from dual union all select '03.01.07',         4
  7      from dual union all select '04.01.07',         5
  8      from dual union all select '04.01.07',         6
  9      from dual union all select '04.01.07',         7
 10     from dual union all select '05.01.07',         2
 11     from dual union all select '08.01.07',         10
 12     from dual
 13     )
 14  select distinct dt, sum(gr) over(order by dt) "Count"
 15    from (select dt,
 16                 case
 17                   when dt =
 18                        first_value(dt) over(partition by IdClient) then
 19                    1
 20                   else
 21                    0
 22                 end as gr
 23            from tab)
 24   order by dt
 25  /
 
DT            Count
-------- ----------
01.01.07          2
02.01.07          3
03.01.07          4
04.01.07          7
05.01.07          7
08.01.07          8
 
6 rows selected
 
SQL> 


Этот запрос считает неправильно уникальных клиентов.
19 ноя 07, 16:29    [4934761]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116175
Гость123
dmidek
Я тоже придумал вариантик, немного похожий на метод
start_of_group


Этот запрос считает неправильно уникальных клиентов.


А можно вариант неверной работы ? Не пойму, где ошибка в логике ...
19 ноя 07, 17:21    [4935249]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог по уникальности  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
dmidek
А можно вариант неверной работы ? Не пойму, где ошибка в логике ...
select '01.01.07' dt, 1 IdClient
    from dual union all select '01.01.07',         2
    from dual union all select '01.01.07',         1
...
но может быть такого в принципе не может быть :)
19 ноя 07, 17:32    [4935363]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить