powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сделать выборку
12 сообщений из 12, страница 1 из 1
Сделать выборку
    #39620628
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Помогите плз. сделать выборку..
есть табличка с бэкапами..

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with a (serv, mesto, status, dat) as  
 (SELECT 'SID_1', 'DISK' , 'OK', to_date('04.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'OK', to_date('04.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'DISK' , 'OK', to_date('03.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'OK', to_date('03.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'DISK' , 'OK', to_date('02.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'OK', to_date('02.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'DISK' , 'OK', to_date('01.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'OK', to_date('01.01.2018','dd.mm.yyyy')  FROM dual  )
  SELECT * FROM (
  SELECT  a.*
   , row_number() over (partition BY serv, mesto, status ORDER by dat desc ) as rn
    FROM a ) 
    WHERE rn=1



Вывожу данные за последний день.

Если статус не ОК , то в табличку смотрю за последние 5 дней как все проходило.

Чтобы много не бегать по табличке, мысть реализовать так:
Если на последнюю дату статус по сиду ОК, то оставляем одну запись.
Если BAD, по данному "mesto" вывести за последние 5 дней.
Подскажите как сделать без PL/SQL

Спасибо
...
Рейтинг: 0 / 0
Сделать выборку
    #39620650
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал вот так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
with a (serv, mesto, status, dat) as  
 (SELECT 'SID_1', 'DISK' , 'OK', to_date('04.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'BAD', to_date('04.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'DISK' , 'OK', to_date('03.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'OK', to_date('03.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'DISK' , 'OK', to_date('02.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'OK', to_date('02.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'DISK' , 'OK', to_date('01.01.2018','dd.mm.yyyy')  FROM dual union all
  SELECT 'SID_1', 'STB'  , 'OK', to_date('01.01.2018','dd.mm.yyyy')  FROM dual  )

  SELECT  a.*  FROM a 
    WHERE 
    mesto = 'DISK' 
    and rownum <= (  select decode(status,'OK',1,5) FROM (SELECT  a.*
   , row_number() over (partition BY serv, mesto ORDER by dat desc ) as rn
    FROM a ) 
    WHERE 
    mesto = 'DISK' 
    and rn =1 )
    union all

  SELECT  a.*  FROM a  
    WHERE 
    mesto = 'STB' 
    and rownum <= (  select decode(status,'OK',1,5) FROM (SELECT  a.*
   , row_number() over (partition BY serv, mesto ORDER by dat desc ) as rn
    FROM a ) 
    WHERE 
    mesto = 'STB' 
    and rn =1 )
   ORDER BY 1,2,4 desc



но как-то корявенько и это в случае когда я точно знаю mesto..
ну вы сами видите...
...
Рейтинг: 0 / 0
Сделать выборку
    #39620660
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mossно как-то корявенько и это в случае когда я точно знаю mesto..Ходи от справочника мест.
...
Рейтинг: 0 / 0
Сделать выборку
    #39620662
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicХоди от справочника мест… lateral-ом.
...
Рейтинг: 0 / 0
Сделать выборку
    #39620664
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moss,

допилить дни (сделал 5 последн записей)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SQL> ed
Wrote file afiedt.buf

  1  with a (serv, mesto, status, dat) as
  2   (SELECT 'SID_1', 'DISK' , 'ой', to_date('04.01.2018','dd.mm.yyyy')  FROM dual union all
  3    SELECT 'SID_1', 'STB'  , 'OK', to_date('04.01.2018','dd.mm.yyyy')  FROM dual union all
  4    SELECT 'SID_1', 'DISK' , 'OK', to_date('03.01.2018','dd.mm.yyyy')  FROM dual union all
  5    SELECT 'SID_1', 'STB'  , '??', to_date('03.01.2018','dd.mm.yyyy')  FROM dual union all
  6    SELECT 'SID_1', 'DISK' , 'OK', to_date('02.01.2018','dd.mm.yyyy')  FROM dual union all
  7    SELECT 'SID_1', 'STB'  , 'OK', to_date('02.01.2018','dd.mm.yyyy')  FROM dual union all
  8    SELECT 'SID_1', 'DISK' , 'ой', to_date('01.01.2018','dd.mm.yyyy')  FROM dual union all
  9    SELECT 'SID_1', 'STB'  , 'OK', to_date('01.01.2018','dd.mm.yyyy')  FROM dual  )
 10  ,b as (
 11  select
 12   a.*
 13  ,row_number() over (partition BY serv, mesto /*, status */ ORDER by dat desc ) as rn
 14  ,first_value(status) over (partition BY serv, mesto /*, status */ ORDER by dat desc ) fv
 15   from a
 16  )
 17  select * from b where fv='OK' and rn=1 or (fv<>'OK' and rn<6)
 18* order by 1,2,4
SQL> /

SERV  MEST ST DAT              RN FV
----- ---- -- -------- ---------- --
SID_1 DISK ой 01.01.18          4 ой
SID_1 DISK OK 02.01.18          3 ой
SID_1 DISK OK 03.01.18          2 ой
SID_1 DISK ой 04.01.18          1 ой
SID_1 STB  OK 04.01.18          1 OK

SQL>



.....
stax
...
Рейтинг: 0 / 0
Сделать выборку
    #39620935
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
спасибо большое.
все доступно понятно.
...
Рейтинг: 0 / 0
Сделать выборку
    #39620941
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicElicХоди от справочника мест… lateral-ом.
благодарю.
не использовал lateral(если честно и не знал о нем), но обязательно почитаю и попробую разобраться.
...
Рейтинг: 0 / 0
Сделать выборку
    #39620951
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не видать мне lateral (
11g у меня..
...
Рейтинг: 0 / 0
Сделать выборку
    #39620955
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MossStax,
спасибо большое.
все доступно понятно.
если оракл не древний (раз доступен латерал)
то, возможно, красивше (правильней) с помощью match_recognize

.....
stax
...
Рейтинг: 0 / 0
Сделать выборку
    #39621112
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
древний ((
сделал по Вашему аналогу.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 'BACKUP', SESSION_KEY, INPUT_TYPE, STATUS, output_device_type ,end_time , decode(fv,'COMPLETED',null,'COMPLETED WITH ERRORS','-- attention -- ','RUNNING', '--running--',  ' !! WARNING !! ' ) as msg
   from 
(SELECT   a.*
   ,row_number() over (partition BY INPUT_TYPE, output_device_type ORDER by end_time desc ) as rn
   ,first_value(status) over (partition BY INPUT_TYPE, output_device_type  ORDER by end_time desc ) as fv
    from ( select SESSION_KEY, INPUT_TYPE, STATUS, output_device_type,
       TO_CHAR(END_TIME,'dd.mm.yyyy hh24:mi') as  end_time
       FROM v$rman_backup_job_details
       where END_TIME > sysdate - 7) a)
 where fv='COMPLETED' and rn=1 or (fv<>'COMPLETED' )
  order by INPUT_TYPE,output_device_type,SESSION_KEY desc;
...
Рейтинг: 0 / 0
Сделать выборку
    #39621580
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MossStax,
древний ((
сделал по Вашему аналогу.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT 'BACKUP', SESSION_KEY, INPUT_TYPE, STATUS, output_device_type ,end_time , decode(fv,'COMPLETED',null,'COMPLETED WITH ERRORS','-- attention -- ','RUNNING', '--running--',  ' !! WARNING !! ' ) as msg
   from 
(SELECT   a.*
   ,row_number() over (partition BY INPUT_TYPE, output_device_type ORDER by end_time desc ) as rn
   ,first_value(status) over (partition BY INPUT_TYPE, output_device_type  ORDER by end_time desc ) as fv
    from ( select SESSION_KEY, INPUT_TYPE, STATUS, output_device_type,
       TO_CHAR(END_TIME,'dd.mm.yyyy hh24:mi') as  end_time
       FROM v$rman_backup_job_details
       where END_TIME > sysdate - 7) a)
 where fv='COMPLETED' and rn=1 or (fv<>'COMPLETED' )
  order by INPUT_TYPE,output_device_type,SESSION_KEY desc;



И сделал неправильно, TO_CHAR(END_TIME,'dd.mm.yyyy hh24:mi') as end_time да под сортировку ORDER by end_time desc будет врать для rn=1 ну или у Вас "своя логика"
...
Рейтинг: 0 / 0
Сделать выборку
    #39622572
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,
спасибо, Вы правы, сортировка char-a
сделал сортировку по типу date
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 'BACKUP', SESSION_KEY, INPUT_TYPE, STATUS, output_device_type ,end_time
    , decode(fv,'COMPLETED',null,'COMPLETED WITH ERRORS','-- attention -- ','RUNNING', '--running--','RUNNING WITH ERRORS','-- attention --',  ' !! WARNING !! ' ) as stat
   from
   (select
       a.*
          ,row_number() over (partition BY INPUT_TYPE, output_device_type  ORDER by end_time_dat desc ) as rn
             ,first_value(status) over (partition BY INPUT_TYPE, output_device_type ORDER by end_time_dat desc ) fv
                 from (
                 select SESSION_KEY, INPUT_TYPE, STATUS, output_device_type,
                        TO_CHAR(END_TIME,'dd.mm.yyyy hh24:mi')   end_time
                        , end_time as end_time_dat
                               FROM v$rman_backup_job_details
                                      where END_TIME > sysdate - 7) a)
                                       where fv='COMPLETED' and rn=1 or (fv<>'COMPLETED' )
                                         order by INPUT_TYPE,output_device_type,SESSION_KEY desc;
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сделать выборку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]