powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пересечение интервалов по приоритету
5 сообщений из 5, страница 1 из 1
Пересечение интервалов по приоритету
    #40066214
TMNlogin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Подскажите пожалуйста, как решить такую задачу на sql, либо дайте ссылку на решение. Поиском ничего найти не могу. Спасибо.

Исходные данные

start stop color priority
40 60 красный 1
100 110 красный 1
20 50 желтый 2
80 90 желтый 2
10 70 синий 3
80 110 синий 3

Результат
start stop color
10 20 синий
20 30 желтый
30 40 желтый
40 50 красный
50 60 красный
60 70 синий
80 90 желтый
90 100 синий
100 110 красный
...
Рейтинг: 0 / 0
Пересечение интервалов по приоритету
    #40066273
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Пересечение интервалов по приоритету
    #40066275
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TMNlogin,

Покажите что пытались сделать, вот тестовые данные
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH t(start,stop,color,priority) as (
select 40,60,'красный',1 from dual union all
select 100,110,'красный',1 from dual union all
select 20,50,'желтый',2 from dual union all
select 80,90,'желтый',2 from dual union all
select 10,70,'синий',3 from dual union all
select 80,110,'синий',3 from dual
)
select * from t;



памятка:
HOWTO :: Как правильно задавать вопросы
Как мне оформить свое сообщение?
Студентам, желающим помощи

1) Полная постановка задачи (без сокращений)
2) Подготовьте тестовые данные, лучше в виде with
например (не ваш случай):

Код: 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.
-- table 1 with column list
with user_tab(user_id,user_name,registry_date) as (
select 1,'Bob',to_date('11.02.1921 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2,'Max',to_date('11.02.1922 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 3,'Jon',to_date('11.02.1923 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual
)
-- table 2 with column list
,user_post(post_id,user_id,parent_post_id,post_date,message) as (
select 100,1,null,to_date('11.02.1923 23:04:00','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 101,2,100,to_date('11.02.1923 23:05:23','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 102,3,100,to_date('11.02.1923 23:05:35','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 103,1,102,to_date('11.02.1923 23:06:00','DD.MM.YYYY HH24:MI:SS'),'How are you' from dual union all
select 104,2,102,to_date('11.02.1923 23:07:05','DD.MM.YYYY HH24:MI:SS'),'All right!' from dual union all
select 105,1,101,to_date('11.02.1923 23:06:21','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 106,1,104,to_date('11.02.1923 23:04:37','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 107,2,null,to_date('11.02.1923 23:08:56','DD.MM.YYYY HH24:MI:SS'),'Hmm' from dual
)
-- query sample
select
-- level
-- ,u.user_name
-- ,p.message
rpad(to_char(p.post_date,'YYYY-MM-DD HH24:MI:SS  '),20+level*2,' ')||u.user_name||': '||p.message as txt
from 
 user_post p
 join user_tab  u on ( p.user_id = u.user_id)
where p.post_date >= u.registry_date
start with p.parent_post_id is null 
connect by prior p.post_id=p.parent_post_id 
;

TXT
--------------------------------------------------------------------------------
1923-02-11 23:04:00   Bob: Hi
1923-02-11 23:05:23     Max: Hi
1923-02-11 23:06:21       Bob: Bye
1923-02-11 23:05:35     Jon: Hi
1923-02-11 23:06:00       Bob: How are you
1923-02-11 23:07:05       Max: All right!
1923-02-11 23:04:37         Bob: Bye
1923-02-11 23:08:56   Max: Hmm

8 rows selected.



3) Покажите что сделали, что получили, без сокращений. ( лучше не в виде screenshot)

4) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение
...
Рейтинг: 0 / 0
Пересечение интервалов по приоритету
    #40066389
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Пересечение интервалов по приоритету
    #40066539
TMNlogin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такое решение получилось

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
WITH t(p1,p2,color,priority) as (
  select 40,60,'красный',1 from dual union all
  select 100,110,'красный',1 from dual union all
  select 20,50,'желтый',2 from dual union all
  select 80,90,'желтый',2 from dual union all
  select 10,70,'синий',3 from dual union all
  select 80,110,'синий',3 from dual /*union all
  select 10,110,'черный',4 from dual*/
), p0 as (
    select p1 p, t.color, t.priority, 'r' t from t t
    where not exists(select null from t t1 where t1.p1 <= t.p1 and t1.p2 >= t.p1 and t1.priority < t.priority)
    union all
    select p2 p, t.color, t.priority, 'b' t from t t
    where not exists(select null from t t1 where t1.p1 <= t.p2 and t1.p2 >= t.p2 and t1.priority < t.priority)
), p as (
select p, color, priority, t, row_number() over(order by p) rn from p0 p
)
select p1.p, p2.p,
nvl(case when p1.t = 'r' then p1.color when p1.t = 'b' and p2.t = 'b' then p2.color end,
(select t.color from t t where t.p1<=p1.p and t.p2>p1.p and not exists(select null from t t0 where t0.p1 <= p1.p and t0.p2 > p1.p and t0.priority < t.priority))) color
--,p1.t, p2.t
from p p1
join p p2 on p1.rn + 1 = p2.rn
order by p1.p
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пересечение интервалов по приоритету
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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