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

Откуда:
Сообщений: 19
Господа, прошу помочь с решением.

Дана некая таблица вида

DATE VALUE
---------- --------
01/01/08 100
02/01/08 100
03/01/08 150
04/01/08 150
05/01/08 150
06/01/08 100
...

Как запросом реализовать результат:

BEGIN_DATE END_DATE VALUE
-------------- ------------ --------
01/01/08 02/01/08 100
03/01/08 05/01/08 150
06/01/08 06/01/08 100
...


Возможно ли такое вообще?
Если тема уже обсуждалась - дайте пожалуйста ссылку.
В факах и поиском найти не смог.


Спасибо.
28 мар 08, 14:55    [5473675]     Ответить | Цитировать Сообщить модератору
 Re: min/max из одного поля по значению второго  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
erkz
Если тема уже обсуждалась - дайте пожалуйста ссылку.
В факах и поиском найти не смог.
ищите по start_of_group
28 мар 08, 14:58    [5473683]     Ответить | Цитировать Сообщить модератору
 min/max из одного поля по значению второго  [new]
erkz
Member

Откуда:
Сообщений: 19
Добавлю - Oracle 10g
28 мар 08, 14:59    [5473694]     Ответить | Цитировать Сообщить модератору
 Re: min/max из одного поля по значению второго  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
WITH tab AS (SELECT 
to_date('01.01.2008','dd.mm.yyyy') dt,   100 val FROM dual UNION ALL SELECT
to_date('02.01.2008','dd.mm.yyyy') ,   100 FROM dual UNION ALL SELECT
to_date('03.01.2008','dd.mm.yyyy') ,   150 FROM dual UNION ALL SELECT
to_date('04.01.2008','dd.mm.yyyy') ,   150 FROM dual UNION ALL SELECT
to_date('05.01.2008','dd.mm.yyyy') ,   150 FROM dual UNION ALL SELECT
to_date('06.01.2008','dd.mm.yyyy') ,   100 FROM dual)

SELECT MIN(dt) begin_date,MAX(dt) end_date,val 
  FROM (SELECT dt,val,start_of_group,sum(start_of_group) over(order by dt) as group_no
          FROM (SELECT dt,val,CASE WHEN lag(val,1,-val) over (ORDER BY dt)<>val THEN 1 ELSE 0 END start_of_group 
                  FROM tab 
                )
       ) 
 GROUP BY val,group_no 
 ORDER BY MIN(dt)

BEGIN_DATE	END_DATE	VAL
-----------------------------------
01.01.2008	02.01.2008	100
03.01.2008	05.01.2008	150
06.01.2008	06.01.2008	100
28 мар 08, 15:49    [5474058]     Ответить | Цитировать Сообщить модератору
 Re: min/max из одного поля по значению второго  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Евгений_25
CASE WHEN lag(val,
 1,-val
) over (ORDER BY dt)<>val THEN 1 ELSE 0 END start_of_group 
А чего ради? :)
28 мар 08, 16:01    [5474135]     Ответить | Цитировать Сообщить модератору
 min/max из одного поля по значению второго  [new]
erkz
Member

Откуда:
Сообщений: 19
Jannny спасибо, нашёл нужную информацию, изучаю матчасть.

Evgeniy_25, спасибо за решение, работает.
28 мар 08, 16:07    [5474187]     Ответить | Цитировать Сообщить модератору
 Re: min/max из одного поля по значению второго  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
Jannny
Евгений_25
CASE WHEN lag(val,
 1,-val
) over (ORDER BY dt)<>val THEN 1 ELSE 0 END start_of_group 
А чего ради? :)


ну мы ж вроде с числами работаем, вроде как можно...
28 мар 08, 16:13    [5474235]     Ответить | Цитировать Сообщить модератору
 Re: min/max из одного поля по значению второго  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Евгений_25
Jannny
Евгений_25
CASE WHEN lag(val,
 1,-val
) over (ORDER BY dt)<>val THEN 1 ELSE 0 END start_of_group 
А чего ради? :)
ну мы ж вроде с числами работаем, вроде как можно...
Я спрашиваю, зачем, а не говорю, что так нельзя :)
28 мар 08, 16:17    [5474257]     Ответить | Цитировать Сообщить модератору
 Re: min/max из одного поля по значению второго  [new]
Elic
Member

Откуда:
Сообщений: 29990
Jannny
А чего ради? :)
Похоже, он не догадался без них инвертировать условие :)
Что прикольно, но и на нуле тоже работает :)
28 мар 08, 16:24    [5474306]     Ответить | Цитировать Сообщить модератору
 Re: min/max из одного поля по значению второго  [new]
Евгений_25
Member

Откуда: Харьков
Сообщений: 460
Jannny
Евгений_25
Jannny
Евгений_25
CASE WHEN lag(val,
 1,-val
) over (ORDER BY dt)<>val THEN 1 ELSE 0 END start_of_group 
А чего ради? :)
ну мы ж вроде с числами работаем, вроде как можно...
Я спрашиваю, зачем, а не говорю, что так нельзя :)


честно говоря, привычка, на практике нигде такое не использую, только тут на форуме, вот как первый раз так написал, теперь все время и пишу...
28 мар 08, 16:55    [5474596]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить