Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Групировка по уникальному вхождению / 21 сообщений из 21, страница 1 из 1
12.10.2017, 13:34
    #39535352
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
Есть таблица

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Date         Platform    ID
2016-01	Test1	1
2016-01	Test1	2
2016-01	Test2	1
2016-01	Test2	2
2016-01	Test3	2
2016-01	Test3        2
2016-01	Test3	1
2016-01	Test3	3
2016-01	Test4	1
2016-01	Test4	2
2016-01	Test4	3
2016-01	Test4	4
2016-01	Test4	5
2016-01	Test4	6



Мне надо вывести количество уникальных ID которых входят в групп Test4 и рядом количество уникальных значений, которые входят только в Test4 (а данном случае)

То есть на выходе должно быть
Код: plsql
1.
Test4 |6 | 3


Ну можно и другие данные из группировок вывести

Мне главное посмотреть как получить которые входят только в Test4
...
Рейтинг: 0 / 0
12.10.2017, 13:49
    #39535360
Групировка по уникальному вхождению
-=Koba=-,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
with t(dt_chr, platform, id) as
(
   select  '2016-01',	'Test1',	1 from dual union all
   select  '2016-01',	'Test1',	2 from dual union all
   select  '2016-01',	'Test2',	1 from dual union all
   select  '2016-01',	'Test2',	2 from dual union all
   select  '2016-01',	'Test3',	2 from dual union all
   select  '2016-01',	'Test3',  2 from dual union all
   select  '2016-01',	'Test3',	1 from dual union all
   select  '2016-01',	'Test3',	3 from dual union all
   select  '2016-01',	'Test4',	1 from dual union all
   select  '2016-01',	'Test4',	2 from dual union all
   select  '2016-01',	'Test4',	3 from dual union all
   select  '2016-01',	'Test4',	4 from dual union all
   select  '2016-01',	'Test4',	5 from dual union all
   select  '2016-01',	'Test4',	6 from dual 
),
t2(id) as
(
  select id from t where platform <> 'Test4'
)
select t.platform, count(distinct t.id), count(distinct t2.id) 
from      t
left join t2 on t.id = t2.id
where platform = 'Test4'
group by platform;
...
Рейтинг: 0 / 0
12.10.2017, 13:54
    #39535367
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
Благодарю за помощь в направлении
...
Рейтинг: 0 / 0
12.10.2017, 14:23
    #39535393
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
пушок лошок,

авторМне главное посмотреть как получить которые входят только в Test4

.....
stax
...
Рейтинг: 0 / 0
12.10.2017, 15:03
    #39535434
Групировка по уникальному вхождению
Stax, ?
...
Рейтинг: 0 / 0
12.10.2017, 15:06
    #39535435
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
А можно ли наложить данное решение сюда?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
/* Formatted on 12.10.2017 15:01:06 (QP5 v5.313) */
WITH
	t (operation_time, platform, USER_ID) AS
		(SELECT '2016-01', 'Test1', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL)
  SELECT operation,
		 SUM (a),
		 SUM (b),
		 SUM (c),
		 SUM (d)
	FROM (SELECT *
			FROM (	SELECT operation_time AS operation, platform, USER_ID
					  FROM t
					 WHERE platform IN ('Test1',
										'Test2',
										'Test3',
										'Test4')
				  GROUP BY GROUPING SETS ((operation_time, PLATFORM, USER_ID), (PLATFORM, USER_ID)))
				 PIVOT
					 (COUNT (*) FOR platform IN ('Test1' AS A, 'Test2' AS B, 'Test3' AS C, 'Test4' AS D)))
GROUP BY operation
ORDER BY operation



Код: plsql
1.
2.
3.
4.
5.
6.
7.
2016-01	1	1	1	1
2016-02	1	1	1	1
2016-03	0	0	1	1
2016-04	0	0	1	1
2016-05	0	0	0	1
2016-06	0	0	0	1
        	2	2	3	6



Тут подсчитывают количество уникальных вхождений в платформу за период
Мне нужна 5 колонка для test4
Код: plsql
1.
2.
3.
4.
5.
6.
7.
2016-01	1	1	1	1   0
2016-02	1	1	1	1   0
2016-03	0	0	1	1   0
2016-04	0	0	1	1   1
2016-05	0	0	0	1   1
2016-06	0	0	0	1   1
        	2	2	3	6   3



У test4 за период 2016-01, 2016-02, 2016-03 входят в другие группы, не считаются,
А 2016-04б 2016-05, 2016-06 уже подходят
...
Рейтинг: 0 / 0
12.10.2017, 15:29
    #39535454
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
-=Koba=-,

Постановка задачи сформулирована .... не достаточно точно
Надо что-то такое?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
WITH
	t (operation_time, platform, USER_ID) AS
		(SELECT '2016-01', 'Test1', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL)


	SELECT platform, count(distinct USER_ID) cnt_for_all,
	     count(distinct 
	                    case when platform != 'Test4' or operation_time in ('2016-01', '2016-02', '2016-03') then null
	                    else USER_ID end
	          ) cnt_for_4
					  FROM t
					 WHERE platform IN ('Test1',
										'Test2',
										'Test3',
										'Test4')
group by platform
...
Рейтинг: 0 / 0
12.10.2017, 15:39
    #39535466
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
MaximaXXL-=Koba=-,

Постановка задачи сформулирована .... не достаточно точно
Надо что-то такое?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
WITH
	t (operation_time, platform, USER_ID) AS
		(SELECT '2016-01', 'Test1', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL)


	SELECT platform, count(distinct USER_ID) cnt_for_all,
	     count(distinct 
	                    case when platform != 'Test4' or operation_time in ('2016-01', '2016-02', '2016-03') then null
	                    else USER_ID end
	          ) cnt_for_4
					  FROM t
					 WHERE platform IN ('Test1',
										'Test2',
										'Test3',
										'Test4')
group by platform


Да но у вас привязка
or operation_time in ('2016-01', '2016-02', '2016-03')
...
Рейтинг: 0 / 0
12.10.2017, 15:43
    #39535469
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
	t (operation_time, platform, USER_ID) AS
		(SELECT '2016-01', 'Test1', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL)



Мне надо посчитать число уникальных вхождений в platform по периодам

Код: plsql
1.
2.
3.
4.
5.
6.
7.
2016-01	1	1	1	1
2016-02	1	1	1	1
2016-03	0	0	1	1
2016-04	0	0	1	1
2016-05	0	0	0	1
2016-06	0	0	0	1
	2	2	3	6



Это я сделал работает
Мне нужна еще одна колонка для test4 тоже самое уникальное значение в platform по периодам, но плюс еще условие, чтоб USER_ID чтоб былоьше за этот период нигде не появлялся

Удовлетворяет
Код: plsql
1.
2.
3.
4.
5.
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL
...
Рейтинг: 0 / 0
12.10.2017, 15:50
    #39535472
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
Вся тема завалена селектами из юнионоллов. Где тот единственный полный и непротиворечивый пост, из которого можно понять, что требуется автору?
...
Рейтинг: 0 / 0
12.10.2017, 15:54
    #39535476
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
AmKadВся тема завалена селектами из юнионоллов. Где тот единственный полный и непротиворечивый пост, из которого можно понять, что требуется автору?
Последний перед вами
...
Рейтинг: 0 / 0
12.10.2017, 16:08
    #39535487
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
пушок лошокStax, ?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with t(dt_chr, platform, id) as
(
   select  '2016-01',      'Test1',        1 from dual union all
   select  '2016-01',      'Test1',        2 from dual union all
   select  '2016-01',      'Test2',        1 from dual union all
   select  '2016-01',      'Test2',        2 from dual union all
   select  '2016-01',      'Test3',        2 from dual union all
   select  '2016-01',      'Test3',  2 from dual union all
   select  '2016-01',      'Test3',        1 from dual union all
   select  '2016-01',      'Test3',        3 from dual union all
   select  '2016-01',      'Test4',        1 from dual union all
   select  '2016-01',      'Test4',        2 from dual union all
   select  '2016-01',      'Test4',        3 from dual union all
   select  '2016-01',      'Test4',        4 from dual union all
   select  '2016-01',      'Test4',        5 from dual union all
   select  '2016-01',      'Test4',        7 from dual union all
   select  '2016-01',      'Test4',        7 from dual union all
   select  '2016-01',      'Test4',        8 from dual union all
   select  '2016-01',      'Test4',        6 from dual
),
t2(id) as
(
  select id from t where platform <> 'Test4'
)
select t.platform, count(distinct t.id), count(distinct t2.id)
from      t
left join t2 on t.id = t2.id
where platform = 'Test4'
group by platform
/
PLATF COUNT(DISTINCTT.ID) COUNT(DISTINCTT2.ID)
----- ------------------- --------------------
Test4                   8                    3



я так понял что надо 7 вместо 5

.....
stax
...
Рейтинг: 0 / 0
12.10.2017, 16:12
    #39535490
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
-=Koba=-,

посчитайте отдельно и присоедените к пивоту

ps
по ид индекс есть?


......
stax
...
Рейтинг: 0 / 0
12.10.2017, 16:14
    #39535493
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
Да так точно

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
/* Formatted on 12.10.2017 16:14:30 (QP5 v5.313) */
WITH
	t (id, operation_time, platform, USER_ID) AS
		(SELECT 1, '2016-01', 'Test1', 1 FROM DUAL
		 UNION ALL
		 SELECT 2, '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT 3, '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT 4, '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT 5, '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT 6, '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT 7, '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT 8, '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT 9, '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT 10, '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT 11, '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT 12, '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT 13, '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT 14, '2016-06', 'Test4', 6 FROM DUAL)
SELECT *
  FROM t
...
Рейтинг: 0 / 0
12.10.2017, 16:17
    #39535496
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
Stax-=Koba=-,

посчитайте отдельно и присоедените к пивоту

ps
по ид индекс есть?


......
stax

Так это и вопрос как проверить, что за данный период user_id в других платформах кроме test4 не присутствует, по join уже соединю их
...
Рейтинг: 0 / 0
12.10.2017, 16:32
    #39535505
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
-=Koba=-,

влоб,
N проходов по таблічке, не оптимально

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
WITH
	t (operation_time, platform, USER_ID) AS
		(SELECT '2016-01', 'Test1', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 7 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 7 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 8 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL)
,t4 as
(SELECT count(distinct user_id) c4 FROM t t1
 WHERE platform IN ('Test4')
 and not exists (select 1 from t t2 where t2.user_id=t1.user_id 
                   and t2.platform IN ('Test1','Test2','Test3'))
)
,p as (
  SELECT operation,
		 SUM (a),
		 SUM (b),
		 SUM (c),
		 SUM (d)
	FROM (SELECT *
			FROM (	SELECT operation_time AS operation, platform, USER_ID
					  FROM t
					 WHERE platform IN ('Test1',
										'Test2',
										'Test3',
										'Test4')
				  GROUP BY GROUPING SETS ((operation_time, PLATFORM, USER_ID), (PLATFORM, USER_ID)))
				 PIVOT
					 (COUNT (*) FOR platform IN ('Test1' AS A, 'Test2' AS B, 'Test3' AS C, 'Test4' AS D)))
GROUP BY operation
)
select p.*,decode(operation,null,c4) c4 from p,t4
ORDER BY operation
/
SQL> /

OPERATI     SUM(A)     SUM(B)     SUM(C)     SUM(D)         C4
------- ---------- ---------- ---------- ---------- ----------
2016-01          1          1          1          1
2016-02          1          1          1          1
2016-03          0          0          1          1
2016-04          0          0          1          1
2016-05          0          0          0          3
2016-06          0          0          0          1
                 2          2          3          8          5

7 rows selected.



.....
stax
...
Рейтинг: 0 / 0
12.10.2017, 19:50
    #39535642
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
-=Koba=-Так это и вопрос как проверить, что за данный период user_id в других платформах кроме test4 не присутствует, по join уже соединю их
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select platform, count(*) from (     
select user_id, min(platform) platform
from t     
group by user_id
having count(distinct platform) = 1
) group by platform
;     
...
Рейтинг: 0 / 0
12.10.2017, 20:49
    #39535675
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
Благодарю за помощь
...
Рейтинг: 0 / 0
12.10.2017, 20:54
    #39535678
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
-=Koba=-,

Тогда так попробуй
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
WITH
	t (operation_time, platform, USER_ID) AS
		(SELECT '2016-01', 'Test1', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 7 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 7 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 8 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL)
		 
   
select platform, count(distinct USER_ID) cnt_for_all, count(distinct decode(Min_pl_4_ID,'Test4',USER_ID)) cnt_for_4
from (
       select operation_time, platform, USER_ID, First_Value(platform) OVER (partition by user_id ORDER BY decode(platform,'Test4',1,0) ) Min_pl_4_ID
       from t)
group by platform
...
Рейтинг: 0 / 0
12.10.2017, 21:05
    #39535684
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
andrey_anonymous,

Странный ответ для такого случая:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
WITH
	t (operation_time, platform, USER_ID) AS
		(SELECT '2016-01', 'Test1', 10 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test1', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test2', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test2', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test3', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test3', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test3', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-01', 'Test4', 1 FROM DUAL
		 UNION ALL
		 SELECT '2016-02', 'Test4', 2 FROM DUAL
		 UNION ALL
		 SELECT '2016-03', 'Test4', 3 FROM DUAL
		 UNION ALL
		 SELECT '2016-04', 'Test4', 4 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 5 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 7 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 7 FROM DUAL
		 UNION ALL
		 SELECT '2016-05', 'Test4', 8 FROM DUAL
		 UNION ALL
		 SELECT '2016-06', 'Test4', 6 FROM DUAL)
		 

select platform, count(*) from (     
select user_id, min(platform) platform
from t     
group by user_id
having count(distinct platform) = 1
) group by platform
;   

PLATFORM	COUNT(*)
Test1	 1
Test4	 5
...
Рейтинг: 0 / 0
12.10.2017, 21:48
    #39535699
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Групировка по уникальному вхождению
MaximaXXLandrey_anonymous,

Странный ответ для такого случая:
4,5,6,7,8 - уникальны по выборке для Test4, 5 штук
10 - уникально для Test1, 1 штука

В момент написания ответа я не рассматривал хардкод Test4 - просто иллюстрировал способ выделить "уникальность"

...ради забавы порешал общую задачку ТС без самосоединений на collect + multiset except (с хардкодом Test4) и на аналитике - фунцикляется :)
Полагаю, можно также прикрутить модельку и XML - но уже лень.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Групировка по уникальному вхождению / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]