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

drop table t1;
create table t1 (proc varchar2(10), log_date date, status varchar2(10)) ;

insert into t1 values ('TEST1', sysdate- 84, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 85, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 86, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 87, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 88, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 89, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 90, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 91, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 92, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 93, 'SUCCEEDED' );
insert into t1 values ('TEST1', sysdate- 94, 'SUCCEEDED' );
insert into t1 values ('TEST1', sysdate- 95, 'SUCCEEDED' );
insert into t1 values ('TEST1', sysdate- 96, 'SUCCEEDED' );
insert into t1 values ('TEST1', sysdate- 97, 'FAILED' );
insert into t1 values ('TEST1', sysdate- 98, 'SUCCEEDED' );
insert into t1 values ('TEST1', sysdate- 99, 'SUCCEEDED' );
insert into t1 values ('TEST1', sysdate-100, 'SUCCEEDED' );

insert into t1 values ('TEST3', sysdate- 95, 'SUCCEEDED' );
insert into t1 values ('TEST3', sysdate- 96, 'SUCCEEDED' );
insert into t1 values ('TEST3', sysdate- 97, 'SUCCEEDED' );
insert into t1 values ('TEST3', sysdate- 98, 'SUCCEEDED' );
insert into t1 values ('TEST3', sysdate- 99, 'SUCCEEDED' );
insert into t1 values ('TEST3', sysdate-100, 'SUCCEEDED' );
commit;

у меня исходная таблица выглядит так:

select * from t1 order by proc, log_date desc

PROC       LOG_DATE           STATUS
---------- ------------------ ----------
TEST1      10-MAY-10          FAILED
TEST1      09-MAY-10          FAILED
TEST1      08-MAY-10          FAILED
TEST1      07-MAY-10          FAILED
TEST1      06-MAY-10          FAILED
TEST1      05-MAY-10          FAILED
TEST1      04-MAY-10          FAILED
TEST1      03-MAY-10          FAILED
TEST1      02-MAY-10          FAILED
TEST1      01-MAY-10          SUCCEEDED
TEST1      30-APR-10          SUCCEEDED
TEST1      29-APR-10          SUCCEEDED
TEST1      28-APR-10          SUCCEEDED
TEST1      27-APR-10          FAILED
TEST1      26-APR-10          SUCCEEDED
TEST1      25-APR-10          SUCCEEDED
TEST1      24-APR-10          SUCCEEDED
TEST3      29-APR-10          SUCCEEDED
TEST3      28-APR-10          SUCCEEDED
TEST3      27-APR-10          SUCCEEDED
TEST3      26-APR-10          SUCCEEDED
TEST3      25-APR-10          SUCCEEDED
TEST3      24-APR-10          SUCCEEDED

23 rows selected.

Нужно получить выборку по каждой процедуре (PROC) с последним статусом выполнения (STATUS), количеством выполнений (CNT), временем когда поменялся статус (STATUS_DATE) и когда было последнее выполнение (LAST_STATUS_DATE). т.е. результат выборки должен быть примерно таким (поле PREV_STATUS не обязательно):

PROC       STATUS_DATE        STATUS     PREV_STATU LAST_STATUS_DATE          CNT
---------- ------------------ ---------- ---------- ------------------ ----------
TEST1      02-MAY-10          FAILED     SUCCEEDED  10-MAY-10                   9
TEST3      24-APR-10          SUCCEEDED  UNKNOWN    29-APR-10                   6

У меня есть запрос который выдает нужный результат (пока не выкладываю, чтобы не сбивать с правильных мыслей.:) ), но мне он не очень нравится и думаю можно написать проще и эффективнее. Причем, еще следует учесть что размер таблицы может быть довольно большим, хотя это можно будет обойти, если что.

Есть какие-нибудь идеи?

PS: если это важно, то версия оракла 11g
4 авг 10, 16:43    [9209839]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
_alex3
У меня есть запрос который выдает нужный результат (пока не выкладываю, чтобы не сбивать с правильных мыслей.:) )


Выложите, чтобы сбивать с неправильных.
4 авг 10, 17:05    [9210111]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
_alex3
Guest
suPPLer,

запрос:

with t2 as                                                                              
(                                                                                       
select * from (                                                                         
select proc,                                                                            
       log_date as status_date,                                                         
       status,                                                                          
       lag(status, 1, 'UNKNOWN') over (partition by proc order by log_date) prev_status,
       max(log_date) over (partition by proc, status) last_status_date,                 
       count(*) over (partition by proc, status order by log_date desc) cnt             
from t1                                                                                 
)                                                                                       
where status!=prev_status                                                               
order by proc, status_date desc                                                         
)                                                                                       
select * from t2 a                                                                      
where a.status_date=(select max(b.status_date) from t2 b where b.proc=a.proc)           
4 авг 10, 17:20    [9210256]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
_alex3
Guest
строка с "order by ..." - лишняя.
4 авг 10, 17:26    [9210310]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
JaRo
Member

Откуда:
Сообщений: 1659
select proc, max(status) keep (dense_rank last order by log_date) status, 
      max(log_date) keep (dense_rank first order by st, log_date desc) STATUS_DATE, 
      max(log_date) LAST_STATUS_DATE,  count(*) cnt
from (select t.*, decode(status, lag(status) over (partition by proc order by log_date), null, 1) st
        from t
      ) t
group by proc
4 авг 10, 17:41    [9210478]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
Proteus
Member

Откуда:
Сообщений: 1348
WITH t1 AS (
SELECT 'TEST1' proc , sysdate- 84 log_date, 'FAILED' status FROM dual UNION ALL
SELECT 'TEST1', sysdate- 85, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 86, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 87, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 88, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 89, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 90, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 91, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 92, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 93, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 94, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 95, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 96, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 97, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 98, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 99, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate-100, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 95, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 96, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 97, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 98, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 99, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate-100, 'SUCCEEDED' FROM dual )
,s1 AS (SELECT proc, MAX(log_date_b) log_date_b, MAX(log_date_e ) log_date_e FROM (
SELECT proc, status, MIN(log_date) log_date_b, MAX(log_date) log_date_e FROM (
SELECT proc, status, log_date, row_number() OVER (PARTITION BY proc, status ORDER BY log_date ) rn
  FROM t1)
GROUP BY proc, status, log_date-rn)
GROUP BY proc)
SELECT proc,  status_date, status, CASE WHEN cnt=cnt2 THEN 'UNKNOWN' ELSE prev_status END prev_status, last_status_date, cnt
FROM (
SELECT t1.proc
      ,MAX(log_date_b) status_date
      ,MAX(status) KEEP(dense_rank LAST ORDER BY log_date) status
      ,MAX(status) KEEP(dense_rank FIRST ORDER BY CASE WHEN log_date >= log_date_b THEN NULL END DESC NULLS LAST) prev_status
      ,MAX(log_date) last_status_date
      ,COUNT(CASE WHEN log_date >= log_date_b THEN 1 END) cnt
      ,COUNT(*) cnt2
  FROM t1, s1
 WHERE t1.proc = s1.proc
 GROUP BY t1.proc
)
4 авг 10, 17:56    [9210610]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
JaRo
select proc, max(status) keep (dense_rank last order by log_date) status, 
      max(log_date) keep (dense_rank first order by st, log_date desc) STATUS_DATE, 
      max(log_date) LAST_STATUS_DATE,  count(*) cnt
from (select t.*, decode(status, lag(status) over (partition by proc order by log_date), null, 1) st
        from t
      ) t
group by proc

Судя по всему, ТС хотел не полное количество выполнений, а от последней смены статуса
4 авг 10, 17:56    [9210615]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
_alex3
Guest
JaRo,

Спасибо. :) Попытаюсь разобраться в Вашем запросе. Вот только CNT неправильно. Нужно выдавать количество для текущего статуса (моя оплошность - не совсем четко описал задание). т.е. для TEST1 текущий статус был "FAILED". выводим когда это произошло, когда последний раз выполнялось и сколько раз уже запускалось.

SQL> select proc, max(status) keep (dense_rank last order by log_date) status,
  2               max(log_date) keep (dense_rank first order by st, log_date desc) STATUS_DATE,
  3               max(log_date) LAST_STATUS_DATE,
  4               count(*) cnt
  5  from (select t.*, decode(status, lag(status) over (partition by proc order by log_date), null, 1) st
  6          from t1 t
  7       ) t
  8  group by proc
  9  ;

PROC       STATUS     STATUS_DATE        LAST_STATUS_DATE          CNT
---------- ---------- ------------------ ------------------ ----------
TEST1      FAILED     02-MAY-10          10-MAY-10                  17
TEST3      SUCCEEDED  24-APR-10          29-APR-10                   6
4 авг 10, 17:59    [9210637]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
_alex3
Guest
Хэнк

Судя по всему, ТС хотел не полное количество выполнений, а от последней смены статуса

Да. Именно так. :)
4 авг 10, 18:00    [9210641]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
_alex3
Guest
Proteus,

Спасибо. пошел разбираться.:)
4 авг 10, 18:07    [9210677]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
Proteus
Member

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

совсем не факт что мой проще... и яснее...
4 авг 10, 18:15    [9210728]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
_alex3
Guest
Proteus,

Вообщем-то да. :) Но пока я понял что мне нужно изучить функции keep и dense_rank.
4 авг 10, 18:38    [9210851]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
-2-
Member

Откуда:
Сообщений: 15330
_alex3
мне нужно изучить функции keep и dense_rank.
Эти "функции" (dense_rank в контексте keep) называют в SQL Refernce как FIRST и LAST.
4 авг 10, 19:25    [9211056]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
bsr
Guest
Мое детище :)

WITH t1 AS (
SELECT 'TEST1' proc , sysdate- 84 log_date, 'FAILED' status FROM dual UNION ALL
SELECT 'TEST1', sysdate- 85, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 86, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 87, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 88, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 89, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 90, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 91, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 92, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 93, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 94, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 95, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 96, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 97, 'FAILED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 98, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate- 99, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST1', sysdate-100, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 95, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 96, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 97, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 98, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate- 99, 'SUCCEEDED' FROM dual UNION ALL
SELECT 'TEST3', sysdate-100, 'SUCCEEDED' FROM dual 
)
, t2 as
(select t1.*
, row_number() over (partition by proc order by log_date desc) rn
, rank() over (partition by proc, status order by log_date desc) rv
 from t1
)
select
  proc
, status PREV_STATUS
, min(log_date) STATUS_DATE
, max(log_date) LAST_STATUS_DATE
, count(1) cnt
from t2
where rn = rv
group by proc, status
5 авг 10, 17:45    [9218153]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
Proteus
Member

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

не удовлетворяет условию задачи... :(
5 авг 10, 17:55    [9218286]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
_alex3
Guest
Proteus,

Уфф... :) Разобрался в Вашем варианте. У меня с самого начала возникло сомнение что результат будет неправильным если данные будут другие.
Смутила вот эта строка:

 31  GROUP BY proc, status, log_date-rn)

Но, решил сперва разобраться и все проверить. Вот результат:

SQL> WITH
  2  t2 AS
  3  (
  4  SELECT 'TEST1' proc , sysdate- 84 log_date, 'FAILED' status FROM dual UNION ALL
  5  SELECT 'TEST1', sysdate- 70, 'FAILED' FROM dual UNION ALL
  6  SELECT 'TEST1', sysdate- 72, 'FAILED' FROM dual UNION ALL
  7  SELECT 'TEST1', sysdate- 74, 'FAILED' FROM dual UNION ALL
  8  SELECT 'TEST1', sysdate- 76, 'FAILED' FROM dual UNION ALL
  9  SELECT 'TEST1', sysdate- 78, 'FAILED' FROM dual UNION ALL
 10  SELECT 'TEST1', sysdate- 80, 'FAILED' FROM dual UNION ALL
 11  SELECT 'TEST1', sysdate- 82, 'FAILED' FROM dual UNION ALL
 12  SELECT 'TEST1', sysdate- 84, 'FAILED' FROM dual UNION ALL
 13  SELECT 'TEST1', sysdate- 86, 'SUCCEEDED' FROM dual UNION ALL
 14  SELECT 'TEST1', sysdate- 88, 'SUCCEEDED' FROM dual UNION ALL
 15  SELECT 'TEST1', sysdate- 90, 'SUCCEEDED' FROM dual UNION ALL
 16  SELECT 'TEST1', sysdate- 92, 'SUCCEEDED' FROM dual UNION ALL
 17  SELECT 'TEST1', sysdate- 94, 'FAILED' FROM dual UNION ALL
 18  SELECT 'TEST1', sysdate- 96, 'SUCCEEDED' FROM dual UNION ALL
 19  SELECT 'TEST1', sysdate- 98, 'SUCCEEDED' FROM dual UNION ALL
 20  SELECT 'TEST1', sysdate-100, 'SUCCEEDED' FROM dual UNION ALL
 21  SELECT 'TEST3', sysdate- 84, 'SUCCEEDED' FROM dual UNION ALL
 22  SELECT 'TEST3', sysdate- 87, 'SUCCEEDED' FROM dual UNION ALL
 23  SELECT 'TEST3', sysdate- 91, 'SUCCEEDED' FROM dual UNION ALL
 24  SELECT 'TEST3', sysdate- 94, 'SUCCEEDED' FROM dual UNION ALL
 25  SELECT 'TEST3', sysdate- 97, 'SUCCEEDED' FROM dual UNION ALL
 26  SELECT 'TEST3', sysdate-100, 'SUCCEEDED' FROM dual )
 27  ,s1 AS (SELECT proc, MAX(log_date_b) log_date_b, MAX(log_date_e ) log_date_e FROM (
 28  SELECT proc, status, MIN(log_date) log_date_b, MAX(log_date) log_date_e FROM (
 29  SELECT proc, status, log_date, row_number() OVER (PARTITION BY proc, status ORDER BY log_date ) rn
 30    FROM t2)
 31  GROUP BY proc, status, log_date-rn)
 32  GROUP BY proc)
 33  SELECT proc,  status_date, status, CASE WHEN cnt=cnt2 THEN 'UNKNOWN' ELSE prev_status END prev_status, last_status_date, cnt
 34  FROM (
 35  SELECT t2.proc
 36        ,MAX(log_date_b) status_date
 37        ,MAX(status) KEEP(dense_rank LAST ORDER BY log_date) status
 38        ,MAX(status) KEEP(dense_rank FIRST ORDER BY CASE WHEN log_date >= log_date_b THEN NULL END DESC NULLS LAST) prev_status
 39        ,MAX(log_date) last_status_date
 40        ,COUNT(CASE WHEN log_date >= log_date_b THEN 1 END) cnt
 41        ,COUNT(*) cnt2
 42    FROM t2, s1
 43   WHERE t2.proc = s1.proc
 44   GROUP BY t2.proc
 45  )
 46  ;

PROC  STATUS_DATE        STATUS    PREV_STAT LAST_STATUS_DATE          CNT
----- ------------------ --------- --------- ------------------ ----------
TEST1 27-MAY-10          FAILED    SUCCEEDED 27-MAY-10                   1
TEST3 13-MAY-10          SUCCEEDED SUCCEEDED 13-MAY-10                   1



Думаю, понятно почему так получилось.

А вот вариант bsr очень интересный и простой как все гениальное.:) Так и не понял почему Вы написали что :
Proteus
не удовлетворяет условию задачи... :(

???

Кстати, вместо функции rank можно было бы обойтись только row_number.
Запрос получился красивый.:)) Спасибо.
5 авг 10, 19:50    [9219074]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10053
bsr
Мое детище :)


Or simpler:

WITH t1 AS (
            SELECT 'TEST1' proc , sysdate- 84 log_date, 'FAILED' status FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 85, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 86, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 87, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 88, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 89, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 90, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 91, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 92, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 93, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 94, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 95, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 96, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 97, 'FAILED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 98, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate- 99, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST1', sysdate-100, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST3', sysdate- 95, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST3', sysdate- 96, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST3', sysdate- 97, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST3', sysdate- 98, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST3', sysdate- 99, 'SUCCEEDED' FROM dual UNION ALL
            SELECT 'TEST3', sysdate-100, 'SUCCEEDED' FROM dual
           ),
     t2 AS (
            select  proc,
                    log_date status_date,
                    status,
                    lag(status,1,'UNKNOWN') over(partition by proc order by log_date) prev_status,
                    max(log_date) over(partition by proc) last_status_date,
                    row_number() over(partition by proc order by log_date desc) rn,
                    row_number() over(partition by proc,status order by log_date desc) cnt
              from  t1
           )
select  proc,
        status_date,
        status,
        prev_status,
        last_status_date,
        cnt
  from  t2
  where rn = cnt
    and status != prev_status
  order by proc
/

PROC  STATUS_DA STATUS    PREV_STAT LAST_STAT        CNT
----- --------- --------- --------- --------- ----------
TEST1 05-MAY-10 FAILED    SUCCEEDED 13-MAY-10          9
TEST3 27-APR-10 SUCCEEDED UNKNOWN   02-MAY-10          6

SQL> 

SY.
5 авг 10, 20:39    [9219218]     Ответить | Цитировать Сообщить модератору
 Re: Написать запрос.  [new]
bsr
Guest
Proteus
не удовлетворяет условию задачи... :(

Вы наверное про PREV_STATUS ?
Поспешил, не то название скопипастил :)

WITH t1 AS (
...
)
, t2 as
(select t1.*
, row_number() over (partition by proc order by log_date desc) rn
, rank() over (partition by proc, status order by log_date desc) rv
, lead(status, 1, 'ANKNOVUN') over (partition by proc order by log_date desc) lv
 from t1
)
select
  proc
, status STATUS
, max(decode(status, lv, null, lv)) PREV_STATUS
, min(log_date) STATUS_DATE
, max(log_date) LAST_STATUS_DATE
, count(1) cnt
from t2
where rn = rv
group by proc, status
order by proc
6 авг 10, 09:58    [9220859]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить