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

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

Есть запрос:
select 990005 as param_id,
data_date, t5 as value, 2 as interval_id, 1 as worktime, 0 as state from 

(select * from (select trunc(Data_Date,'HH24')  Data_Date,
avg (case when (param_id > 566) and (param_id < 597) then value else null end) as t5

from dp1_data t
      where DATA_DATE >=  to_date ('20-12-13', 'DD-MM-YY') and DATA_DATE <=  to_date ('21-12-13', 'DD-MM-YY') and 
      interval_id = 2 and 
      value < 100 and value >= 0
      GROUP BY trunc(Data_Date,'HH24')))

union all
      
select 990006 as param_id,
data_date, t6 as value, 2 as interval_id, 1 as worktime, 0 as state from 

(select * from (select trunc(Data_Date,'HH24')  Data_Date,
avg (case when (param_id > 626) and (param_id < 657) then value else null end) as t6

from dp1_data t
      where DATA_DATE >=  to_date ('20-12-13', 'DD-MM-YY') and DATA_DATE <=  to_date ('21-12-13', 'DD-MM-YY') and 
      interval_id = 2 and 
      value < 100 and value >= 0
      GROUP BY trunc(Data_Date,'HH24')))  
 
union all 
 
select 990007 as param_id,
data_date, t7 as value, 2 as interval_id, 1 as worktime, 0 as state from 

(select * from (select trunc(Data_Date,'HH24')  Data_Date,
avg (case when ((param_id > 1879) and (param_id < 1887)) or ((param_id > 722) and (param_id < 753)) then value else null end) as t7


from dp1_data t
      where DATA_DATE >=  to_date ('20-12-13', 'DD-MM-YY') and DATA_DATE <=  to_date ('21-12-13', 'DD-MM-YY') and interval_id = 2
      and value < 100 and value >= 0
      GROUP BY trunc(Data_Date,'HH24'))) 
      
union all

select 990008 as param_id,
data_date, t8 as value, 2 as interval_id, 1 as worktime, 0 as state from 

(select * from (select trunc(Data_Date,'HH24')  Data_Date,
avg (case when (param_id > 782) and (param_id < 813) then value else null end) as t8

from dp1_data t
      where DATA_DATE >=  to_date ('20-12-13', 'DD-MM-YY') and DATA_DATE <=  to_date ('21-12-13', 'DD-MM-YY') and interval_id = 2 
      and value < 100 and value >= 0
      GROUP BY trunc(Data_Date,'HH24'))) 
      
union all

select 990009 as param_id,
data_date, t9 as value, 2 as interval_id, 1 as worktime, 0 as state from 

(select * from (select trunc(Data_Date,'HH24')  Data_Date,
avg (case when (param_id > 842) and (param_id < 873) then value else null end) as t9

from dp1_data t
      where DATA_DATE >=  to_date ('20-12-13', 'DD-MM-YY') and DATA_DATE <=  to_date ('21-12-13', 'DD-MM-YY') and 
      interval_id = 2 and 
      value < 100 and value >= 0
      GROUP BY trunc(Data_Date,'HH24')))    



Хорошо бы сделать без UNION. На какие операторы посмотреть?
Вот в таком духе:

select 990005 as param_id,
data_date, t5 as value, 2 as interval_id, 1 as worktime, 0 as state from 

(select * from (select trunc(Data_Date,'HH24')  Data_Date,
avg (case when (param_id > 566) and (param_id < 597) then value else null end) as t5,
avg (case when (param_id > 626) and (param_id < 657) then value else null end) as t6,
avg (case when ((param_id > 1879) and (param_id < 1887)) or ((param_id > 722) and (param_id < 753)) then value else null end) as t7,
avg (case when (param_id > 782) and (param_id < 813) then value else null end) as t8,
avg (case when (param_id > 842) and (param_id < 873) then value else null end) as t9

from dp1_data t
      where 
     -- param_id > 566 and param_id < 1887
      DATA_DATE >=  to_date ('20-12-12', 'DD-MM-YY') and DATA_DATE <=  to_date ('21-12-13', 'DD-MM-YY') 
      and interval_id = 3 
      and value < 100 and value >= 0
      GROUP BY trunc(Data_Date,'HH24')))
7 апр 14, 14:00    [15843416]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
ну вот на CASE и сделай... :)
7 апр 14, 14:08    [15843513]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх,

а если результат нужен "в столбик", а не "в строку", то разверни эту самую строку посредством UNPIVOT...
7 апр 14, 14:10    [15843527]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iobox
Member

Откуда:
Сообщений: 54
Небольшой нюанс заключается в том, что PIVOT/UNPIVOT появились только в 11 версии. У меня 8-ая.
7 апр 14, 14:35    [15843739]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
iobox,

ты не поверишь, UNPIVOT легко реализуется через CROSS JOIN на табличку с нужным числом строк...
7 апр 14, 14:39    [15843774]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
iobox
Member

Откуда:
Сообщений: 54
Спасибо.
7 апр 14, 14:43    [15843802]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Добрый Э - Эх
Guest
iobox,

если что, вариант разворота строки в столбец:
select case 
         when unpivot.rn = 1 then 'Num' 
         when unpivot.rn = 2 then 'Name' 
         when unpivot.rn = 3 then 'Dt' 
       end as column_name,
       case 
         when unpivot.rn = 1 then to_char(num) 
         when unpivot.rn = 2 then name
         when unpivot.rn = 3 then to_char(dt,'dd.mm.yyyy hh24:mi:ss') 
       end as column_value
  from (-- типа наша табличка с исходными данными:
         select 1 as num, 'djfhsd' as name, sysdate as dt 
           from dual
       ) t, 
      (-- опорная табличка на три строки, так как в базовой таблице - три поля:
        select 1 as rn from dual 
        union all 
        select 2 from dual 
        union all 
        select 3 from dual
      ) unpivot
7 апр 14, 14:49    [15843860]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить