2015-05-05 2 views
0

У меня есть следующая база данных Oracle. Определенный идентификатор может иметь принятый статус, но может оставаться в состоянии отказа и возвращаться в принятом статусе. Это может произойти время X, так что его можно назвать цикломSQL: возраст самых старых предметов

ID  STATUS   TIME INSERT 
------------------------------ 
1  Accepted  01:00:00 
1  Failed   02:00:00 
1  Accepted  02:30:00 
2  Accepted  02:33:00 

Я хочу, чтобы вычислить возраст самого старого элемента с принятым статусом. Это означает, что результат SYSDATE - TIME ВСТАВКУ

Как результат этих данных я ожидаю, что 3d значения времени записи, 2:30:00

мне нужно проверить для самого маленького времени каждого ID и старейшее время жизни всех самых младших жизней ID. Это выглядит довольно сложно для меня.

Шаги рабочего процесса являются:

  1. минимальное значение времени конкретного идентификатора в состоянии Принято
  2. Шаг 1 для каждого идентификатора в принятом состоянии
  3. максимальное значение всех значений мин Я подсчитал, на шаге 2.

на данный момент у меня есть следующий код

select min(TO_CHAR(TO_DATE('20000101','yyyymmdd')+(SYSDATE - dm1.time_insert),'hh24:mi:ss')) 
from db dm1 
where dm1.status='accepted' 
group by dm1.id; 

Это дает мне последовательность минимальных значений всех записей. Но теперь мне нужно максимальное значение из всех этих минимальных значений, как это сделать? Любой, кто может решить этот случай?

+0

которые вы используете? – ughai

+0

Я использую Oracle DB – Jonas

ответ

2

Вы можете просто найти макс (time_insert) и группы по идентификатору. Посмотрите на образец запроса

with src as (
select 1 as id, 'Accepted' as status, to_date('2015-05-05 01:00:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual 
union all 
select 1 as id, 'Failed' as status, to_date('2015-05-05 02:00:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual 
union all 
select 1 as id, 'Accepted' as status, to_date('2015-05-05 02:30:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual 
union all 
select 2 as id, 'Accepted' as status, to_date('2015-05-05 02:33:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual) 

select id, max(time_insert) as time_insert, max(sysdate - time_insert) as lifetime_max, min(sysdate - time_insert) as liftime_min from src 
where status ='Accepted' 
group by id 

Edit: Является ли это то, что вы хотите достичь:

with src as (
select 1 as id, 'Accepted' as status, to_date('2015-05-05 01:00:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual 
union all 
select 1 as id, 'Failed' as status, to_date('2015-05-05 02:00:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual 
union all 
select 1 as id, 'Accepted' as status, to_date('2015-05-05 02:30:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual 
union all 
select 2 as id, 'Accepted' as status, to_date('2015-05-05 02:33:00','yyyy-mm-dd hh24:mi:ss') as time_insert from dual) 
, src2 as (
select max(time_insert) as time_insert, max(sysdate - time_insert) as lifetime_max, min(sysdate - time_insert) as lifetime_min from src 
where status ='Accepted') 
select max(lifetime_min) from src2 
+0

Это не то, чего я хочу достичь. Я получаю последовательность каждого id, я хочу максимальное значение для всех id. – Jonas

+0

Обновлен ответ. Добавлен дополнительный запрос. Пожалуйста, дайте мне знать, если это то, что вы хотите добиться. –

3

Надеется, что это поможет вам:

-- this will give you the minimum date of all id's 
select * from tab1 where TIME_INSERT in (select min(TIME_INSERT) from tab1)and STATUS ='Accepted' 


-- this will give you the minimum date of a specefique id 
select * from tab1 where TIME_INSERT in (select min(TIME_INSERT) from tab1) 
and STATUS ='Accepted' and ID =1 

проверить это

select id, TIME_INSERT from 
(select TIME_INSERT, ID , min(TIME_INSERT) over (partition by ID) maxid from tab1) 
where TIME_INSERT = maxid and TIME_INSERT in(select max(TIME_INSERT) from tab1) group by ID,TIME_INSERT 
+0

, это хорошее начало, теперь мне нужно максимальное значение для всех минимальных id :) – Jonas

+0

Я хочу: 1. минимальное значение времени для определенного id в состоянии Accepted, 2. Я хочу это минимальное значение вычисление каждого id, 3. Я хочу максимальное значение всех этих минимальных значений. – Jonas

1

это будет делать.

SELECT id, 
     min(time_insert), 
     max(time_insert) 
FROM 
     your_table t1 
WHERE 
     status = 'Accepted' 
AND time_insert > (
      SELECT 
        nvl(max(time_insert), to_date('01-JAN-1970', 'DD-MON-YYYY')) 
      FROM 
        your_table 
      WHERE 
        status = 'Failed' 
      AND  id = t1.id 
     ) 
GROUP BY id 
Смежные вопросы