powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Высшая математика блин
9 сообщений из 9, страница 1 из 1
Высшая математика блин
    #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
Высшая математика блин
    #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
Высшая математика блин
    #39365433
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharkoff_new,

groupnig sets
...
Рейтинг: 0 / 0
Высшая математика блин
    #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
Высшая математика блин
    #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
Высшая математика блин
    #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
Высшая математика блин
    #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
Высшая математика блин
    #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
Высшая математика блин
    #39370630
Фотография 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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Высшая математика блин
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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