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

Откуда:
Сообщений: 3
Добрый день!

Подскажите пожалуйста, как решить такую задачу на 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 красный

К сообщению приложен файл. Размер - 23Kb
27 апр 21, 09:20    [22314891]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов по приоритету  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3022
TMNlogin,

похожее Пятничная задача: Красное и черное

.....
stax
27 апр 21, 11:57    [22314984]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов по приоритету  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 7253
TMNlogin,

Покажите что пытались сделать, вот тестовые данные
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
например (не ваш случай):

-- 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) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение
27 апр 21, 11:58    [22314986]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов по приоритету  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5873
TMNlogin,

даже конкретно эта задача:
Пятничная задача: Красное и черное
https://stackoverflow.com/questions/64137899/flatten-list-of-ranges-to-single-result-range-set

Сообщение было отредактировано: 27 апр 21, 15:14
27 апр 21, 15:22    [22315151]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов по приоритету  [new]
TMNlogin
Member

Откуда:
Сообщений: 3
Вот такое решение получилось

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
28 апр 21, 06:42    [22315399]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить