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

Откуда:
Сообщений: 109
Приветсвую! :)

Возникла необходимость сделать выборку из таблицы исходя из того чтобы сумма определенной колонки была меньше или равна некой константе.
Например надо выбрать все сессии, сумма длительности которых не привышает тысячи /секунд/ (сессии упорядочены по времени)
ID;SessionTime;StartTime
5972041353693964997; 180; 01.02.2007 13:38:43
5131267659782742859; 300; 01.02.2007 16:10:39
7913404893186093285; 300; 01.02.2007 16:10:39
7371904025225416565; 30; 02.02.2007 11:46:03
3625772456347730937; 30; 02.02.2007 21:05:35
6392162298392522793; 60; 03.02.2007 00:11:05
3464556894859774756; 120; 03.02.2007 00:11:36
-284745122199411375; 360; 03.02.2007 19:08:34
-8993344402001365768; 240; 03.02.2007 19:21:52
-6491176726125519123; 240; 03.02.2007 21:01:53
4436605493756881858; 112; 03.02.2007 22:47:30
2215850761434688147; 120; 03.02.2007 23:25:36

Нужно чтобы выбралось в данном случае:
ID; SessionTime; StartTime
5972041353693964997; 180; 01.02.2007 13:38:43
5131267659782742859; 300; 01.02.2007 16:10:39
7913404893186093285; 300; 01.02.2007 16:10:39
7371904025225416565; 30; 02.02.2007 11:46:03
3625772456347730937; 30; 02.02.2007 21:05:35
6392162298392522793; 60; 03.02.2007 00:11:05
Что в сумме по длительности дает 900. Длительность следующей сессии равна 120, в сумме получится 1020 - не катит.
Сервер Oracle 10g release2.
16 мар 07, 15:35    [3907962]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
group by .. having
16 мар 07, 15:37    [3907979]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
гвесть
Guest
может я не понял что то но : объедени 2 таблички по ид и вычти время, в оракле оно в сутках так что на секунды делить придётся, хотя мож в 10 для преобразования уже что нить есть
16 мар 07, 15:38    [3907992]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116202
Что то в этом духе ?

SQL> 
SQL> select *
  2    from (select e.*, sum(sal) over(order by hiredate) sum_sal
  3            from scott.emp e)
  4   where sum_sal <= 4000
  5   order by hiredate
  6  /

EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO    SUM_SAL
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
 7369 SMITH      CLERK      7902 17.12.1980     800,00               20        800
 7499 ALLEN      SALESMAN   7698 20.02.1981    1600,00    300,00     30       2400
 7521 WARD       SALESMAN   7698 22.02.1981    1250,00    500,00     30       3650

SQL> 
16 мар 07, 15:39    [3907995]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
select * from (select *, sum() over () crit) where crit<1000
16 мар 07, 15:40    [3908004]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
orawish
select * from (select *, sum() over (
-- здесь не пусто,разумеется
) crit) where crit<1000
16 мар 07, 15:42    [3908023]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
SQL> with tab as (select 5972041353693964997 id, 180 SessionTime, to_date('01.02.2007 13:38:43','dd.mm.yyyy hh24:mi:ss') StartTime
  2  from dual union all select 5131267659782742859, 300, to_date('01.02.2007 16:10:39','dd.mm.yyyy hh24:mi:ss')
  3  from dual union all select 7913404893186093285, 300, to_date('01.02.2007 16:10:39','dd.mm.yyyy hh24:mi:ss')
  4  from dual union all select 7371904025225416565,  30, to_date('02.02.2007 11:46:03','dd.mm.yyyy hh24:mi:ss')
  5  from dual union all select 3625772456347730937,  30, to_date('02.02.2007 21:05:35','dd.mm.yyyy hh24:mi:ss')
  6  from dual union all select 6392162298392522793,  60, to_date('03.02.2007 00:11:05','dd.mm.yyyy hh24:mi:ss')
  7  from dual union all select 3464556894859774756,  120, to_date('03.02.2007 00:11:36','dd.mm.yyyy hh24:mi:ss')
  8  from dual union all select -284745122199411375,  360, to_date('03.02.2007 19:08:34','dd.mm.yyyy hh24:mi:ss')
  9  from dual union all select -8993344402001365768, 240, to_date('03.02.2007 19:21:52','dd.mm.yyyy hh24:mi:ss')
 10  from dual union all select -6491176726125519123, 240, to_date('03.02.2007 21:01:53','dd.mm.yyyy hh24:mi:ss')
 11  from dual union all select 4436605493756881858,  112, to_date('03.02.2007 22:47:30','dd.mm.yyyy hh24:mi:ss')
 12  from dual union all select 2215850761434688147,  120, to_date('03.02.2007 23:25:36','dd.mm.yyyy hh24:mi:ss')
 13  from dual
 14  )
 15  select id, sessiontime, starttime
 16  from(
 17  select t.*, sum(SessionTime) over(order by StartTime) summ from tab t)
 18  where summ <= 1000;

        ID SESSIONTIME STARTTIME
---------- ----------- -----------
5.97204135         180 01/02/2007
5.13126765         300 01/02/2007
7.91340489         300 01/02/2007
7.37190402          30 02/02/2007
3.62577245          30 02/02/2007
6.39216229          60 03/02/2007

6 rows selected

SQL> 
16 мар 07, 15:43    [3908030]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
andrey_anonymous
..
 17  select t.*, sum(SessionTime) 
over(order by StartTime) 
summ from tab t)
 


имхо, over(partition by id)
16 мар 07, 15:48    [3908061]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
orawish
andrey_anonymous
..
 17  select t.*, sum(SessionTime) 
over(order by StartTime) 
summ from tab t)
 


имхо, over(partition by id)

Перечитал вводную.. Понял, что я не прав..
16 мар 07, 15:51    [3908088]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
deleted_2ks3ax
Member [скрыт]

Откуда:
Сообщений: 109
Всем большое человеческое спасибо :-)
а то я, в следствии не знания Oracle, чуть не решился в цикл все засунуть...
16 мар 07, 17:07    [3908770]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Ap0k
Всем большое человеческое спасибо :-)
а то я, в следствии не знания Oracle, чуть не решился в цикл все засунуть...

И, быть может, были не так уж неправы. Предложенный способ нельзя назвать верхом эффективности.
Я бы оформил выборку с order by по индексу курсорным циклом - это позволит избежать лишних чтений.
Для красоты можно запихнуть всю эту прелесть в pipelined.
16 мар 07, 17:19    [3908850]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
Elic
Member

Откуда:
Сообщений: 29980
andrey_anonymous
запихнуть в pipelined.
А не злоупотребляешь ли ты pipelining-ом. Чуть что - pipelined :)
16 мар 07, 17:34    [3908987]     Ответить | Цитировать Сообщить модератору
 Re: Запрос нескольких строк, исходя из хитрого условия.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Elic
andrey_anonymous
запихнуть в pipelined.
А не злоупотребляешь ли ты pipelining-ом. Чуть что - pipelined :)

А для красоты не жалко :)
На самом деле зависит от востребованности функционала и предпочтительной формы - ежели, к примеру, клиент предпочитает SQL-apprach или же просто функционал достаточно востребован чтобы оформить именованным куском кода - то почему бы и не pipelined.
На самом деле удобный механизм.
Ему не хватает только возможности отделять алгоритм от метаданных в стиле STL.
16 мар 07, 17:39    [3909027]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить