Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сделать выборку / 12 сообщений из 12, страница 1 из 1
26.03.2018, 17:09
    #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
26.03.2018, 17:27
    #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
26.03.2018, 17:38
    #39620660
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выборку
Mossно как-то корявенько и это в случае когда я точно знаю mesto..Ходи от справочника мест.
...
Рейтинг: 0 / 0
26.03.2018, 17:39
    #39620662
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выборку
ElicХоди от справочника мест… lateral-ом.
...
Рейтинг: 0 / 0
26.03.2018, 17:41
    #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
27.03.2018, 10:05
    #39620935
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выборку
Stax,
спасибо большое.
все доступно понятно.
...
Рейтинг: 0 / 0
27.03.2018, 10:09
    #39620941
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выборку
ElicElicХоди от справочника мест… lateral-ом.
благодарю.
не использовал lateral(если честно и не знал о нем), но обязательно почитаю и попробую разобраться.
...
Рейтинг: 0 / 0
27.03.2018, 10:17
    #39620951
Moss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выборку
Не видать мне lateral (
11g у меня..
...
Рейтинг: 0 / 0
27.03.2018, 10:20
    #39620955
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сделать выборку
MossStax,
спасибо большое.
все доступно понятно.
если оракл не древний (раз доступен латерал)
то, возможно, красивше (правильней) с помощью match_recognize

.....
stax
...
Рейтинг: 0 / 0
27.03.2018, 12:51
    #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
27.03.2018, 21:23
    #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
29.03.2018, 11:57
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сделать выборку / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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