Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Высшая математика блин / 9 сообщений из 9, страница 1 из 1
13.12.2016, 06:28
    #39365367
sharkoff_new
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
Добрый день
Имеется несколько наборов идентификаторов (id,month), обзовем множество за каждый месяц: m1,m2,m3...m[k-1],m[k]
Необходимо получить на выходе
на шаге
1: множество идентификаторов входящих в набор m1 и m2
2: множество идентификаторов входящих в набор m1 и m2 и m3
3: множество идентификаторов входящих в набор m1 и m2 и m3 и m4
...
k: множество идентификаторов входящих в набор m1 и m2 и m3 и m4 ...m[k]
Что то даже не представляю как подойти к задаче
Любая помощь и идеи приветствуются
...
Рейтинг: 0 / 0
13.12.2016, 07:08
    #39365371
sharkoff_new
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
Тест набор:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    with t as (select to_date(trunc(sysdate, 'mm')), level
     from dual
   connect by level < 30
   union
   select add_months(to_date(trunc(sysdate, 'mm')), -1), level + 3
     from dual
   connect by level < 20
   union
   select add_months(to_date(trunc(sysdate, 'mm')), -2), level + 5
     from dual
   connect by level < 10
   union
   select add_months(to_date(trunc(sysdate, 'mm')), -3), level + 8
     from dual
   connect by level < 5)
   select * from t
...
Рейтинг: 0 / 0
13.12.2016, 09:18
    #39365433
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
sharkoff_new,

groupnig sets
...
Рейтинг: 0 / 0
13.12.2016, 10:24
    #39365504
sharkoff_new
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
env,
Родилась идейка, как то битовыми масками пометить группы, потом собирать в зависимости от битгрупп.
Как сделать с grouping set пока не осилил :(

Код: 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.
with t as
 (select to_date(trunc(sysdate, 'mm')) d_d,
         level id,
         4 k,
         bin_to_num(1, 1, 1, 1) bitmask
    from dual
  connect by level < 30
  union
  select add_months(to_date(trunc(sysdate, 'mm')), -1),
         level + 3,
         3,
         bin_to_num(1, 1, 1, 0) bitmask
    from dual
  connect by level < 20
  union
  select add_months(to_date(trunc(sysdate, 'mm')), -2),
         level + 5,
         2,
         bin_to_num(1, 1, 0, 0) bitmask
    from dual
  connect by level < 10
  union
  select add_months(to_date(trunc(sysdate, 'mm')), -3),
         level + 8,
         1,
         bin_to_num(1, 0, 0, 0) bitmask
    from dual
  connect by level < 5),
-- select * from t
in_grp as
 (select bitmask, bitand(bitmask, bin_to_num(1, 1, 0, 0)), id, d_d
    from t
   where bitand(bitmask, bin_to_num(1, 1, 0, 0)) = bin_to_num(1, 1, 0, 0))
--select * from in_grp   
select id from in_grp group by id having count (1) = 3;
...
Рейтинг: 0 / 0
13.12.2016, 11:26
    #39365560
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    with t as (select to_date(trunc(sysdate, 'mm')) dt, level id
     from dual
   connect by level < 30
   union ALL
   select add_months(to_date(trunc(sysdate, 'mm')), -1), level + 3
     from dual
   connect by level < 20
   union ALL
   select add_months(to_date(trunc(sysdate, 'mm')), -2), level + 5
     from dual
   connect by level < 10
   union ALL
   select add_months(to_date(trunc(sysdate, 'mm')), -3), level + 8
     from dual
   connect by level < 5)
select id 
from t
where dt >= add_months(to_date(trunc(sysdate, 'mm')), -2) -- m1 U m2 U m3
group by id
having count(dictinct trunc(dt,'mm')) = 3 -- id present in all three months
...
Рейтинг: 0 / 0
13.12.2016, 13:20
    #39365658
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
Код: 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.
with t as (select to_date(trunc(sysdate, 'mm')) dt, level lvl
 from dual
connect by level < 30
union all
select add_months(to_date(trunc(sysdate, 'mm')), -1), level + 3
 from dual
connect by level < 20
union all
select add_months(to_date(trunc(sysdate, 'mm')), -2), level + 5
 from dual
connect by level < 10
union all
select add_months(to_date(trunc(sysdate, 'mm')), -3), level + 8
 from dual
connect by level < 5)
select dt, sum(count(*)) over (order by dt) sm
from t
group by dt;

DT                          SM
------------------- ----------
01.09.2016 00:00:00          4
01.10.2016 00:00:00         13
01.11.2016 00:00:00         32
01.12.2016 00:00:00         61
...
Рейтинг: 0 / 0
19.12.2016, 21:29
    #39370598
AndBabushkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
sharkoff_new,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT T.RNK
      ,T.CNT
      ,T.MONTH
  FROM (SELECT MONTH
              ,COUNT(*) OVER(ORDER BY MONTH) AS CNT
              ,ROW_NUMBER() OVER(ORDER BY MONTH) - 1 RNK
          FROM TABLE
       ) T
 WHERE T.RNK > 0
...
Рейтинг: 0 / 0
19.12.2016, 22:05
    #39370609
AndBabushkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
sharkoff_new, немного поторопился. Вот правильное решение:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
WITH CTE (ID, MONTH) AS
  (SELECT 1, 1 FROM DUAL
   UNION ALL
   SELECT 2, 1 FROM DUAL
   UNION ALL
   SELECT 1, 2 FROM DUAL
   UNION ALL
   SELECT 5, 2 FROM DUAL
   UNION ALL
   SELECT 3, 3 FROM DUAL
   UNION ALL
   SELECT 4, 4 FROM DUAL
  )
SELECT DISTINCT T.RNK
      ,T.CNT
  FROM (SELECT MONTH
              ,COUNT(*) OVER(ORDER BY MONTH) AS CNT
              ,DENSE_RANK() OVER(ORDER BY MONTH) - 1 RNK
           FROM CTE
        ) T
 WHERE T.RNK > 0
...
Рейтинг: 0 / 0
19.12.2016, 23:05
    #39370630
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высшая математика блин
Код: plsql
1.
2.
3.
4.
5.
6.
select  id
  from  tbl
  where month in (m1,m2,m3...m[k-1],m[k])
  group by id
  having count(month) = k -- count(distinct month) = k если пара id,month не уникальна
/



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Высшая математика блин / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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