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

select tab.logsb_num_carta,
decode(tab.logsb_codice,'30', decode(coun,1,last_value,first_value),null) dt_approv,
decode(tab.logsb_codice,'35',decode(coun,1,last_value,first_value),null) dt_rifiuto
from
(
select t.logsb_num_carta,t.logsb_data,t.logsb_ora,t.logsb_codice,
count(distinct t.logsb_codice) over(partition by t.logsb_num_carta) coun,
last_value(t.logsb_data)
over(partition by t.logsb_num_carta ) last_value,
first_value(t.logsb_data)
over(partition by t.logsb_num_carta ) first_value,
row_number()
over(partition by t.logsb_num_carta order by t.logsb_data desc,t.logsb_ora desc) rn
from crlgst00x t, pratica p
where t.logsb_codice in('30','35')
and t.logsb_num_carta=p.pratica_id
and
p.dt_approvazione IS NULL OR
(p.dt_approvazione IS NOT NULL AND t.logsb_data <= p.dt_approvazione )
) tab
where rn=1


Практически, есть таблица с номером картьі logsb_num_carta, датой logsb_data, временем logsb_ora и состоянием logsb_codice, которое может бьіть или 30 или 35.
Нужно написать запрос, которьій возвращает для каждой картьі датьі последнего изменения состояния(если состояние 30, то дата состояния 35 - null и наоборот ). При чем, если карта бьіла только в одном из єтих двух состояний, то вернуть минимальную дату, если же бьіла в обох, то вернуть максимальную дату последнего состояния.

Уффф... надеюсь, понятно об"яснила :(
26 мар 07, 18:06    [3941834]     Ответить | Цитировать Сообщить модератору
 Re: помогите переписать запрос  [new]
Elic
Member

Откуда:
Сообщений: 29990
aguka1
Помогите переписать запрос, мне кажется, что его можно составить гораздо удачнее...
Нельзя называть менее удачным неправильное
aguka1
для каждой картьі датьі последнего изменения состояния(если состояние 30, то дата состояния 35 - null и наоборот ). При чем, если карта бьіла только в одном из єтих двух состояний, то вернуть минимальную дату, если же бьіла в обох, то вернуть максимальную дату последнего состояния.
select logsb_num_carta, decode(last_state, '30', last_changed) as dt_approv,
                        decode(last_state, '35', last_changed) as dt_rifiuto
  from
  ( select t.logsb_num_carta, 
        min(t.logsb_codice) keep (dense_rank last order by t.logsb_data, t.logsb_ora) as last_state,
        decode(count(distinct t.logsb_codice), 1, min(t.logsb_data), max(t.logsb_data)) as last_changed
      from crlgst00x t, pratica p
      where t.logsb_codice in ('30','35')
        and ...
      group by t.logsb_num_carta
  )
28 мар 07, 09:25    [3948443]     Ответить | Цитировать Сообщить модератору
 Re: помогите переписать запрос  [new]
aguka1
Guest
Elic, тьі монстр... такое простое и красивое решение.
Добавилось еще одно условие - если датьі и состояния 30 и состояние 35 - null, то взять минимальную дату состояния 20 как dt_approv, а dt_rifiuto оставить null.
Я вообще разобралась как твой запрос работает, но переделать его єффективно, добавив новое условие не получается :(
Помогите!
4 апр 07, 19:41    [3981407]     Ответить | Цитировать Сообщить модератору
 Re: помогите переписать запрос  [new]
Elic
Member

Откуда:
Сообщений: 29990
aguka1
если датьі и состояния 30 и состояние 35 - null, то взять минимальную дату состояния 20 как dt_approv, а dt_rifiuto оставить null.
case when last_state in ('30', '20') then last_changed end as dt_approv,
decode(last_state, '35', last_changed) as dt_rifiuto

min(t.logsb_codice) keep (dense_rank last order by t.logsb_data, t.logsb_ora) as last_state,
decode(count(distinct decode(t.logsb_codice, '30', 1, '35', 2)), 2, max(t.logsb_data), min(t.logsb_data)) as last_changed
Остальное допиши сама :)
5 апр 07, 16:48    [3985983]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить