2015-02-02 2 views
0

У меня есть таблица БД (Oracle), как показано ниже:Oracle Отметка Разница

ID    STATUS    TIMESTAMP 
--    ------    --------- 
1    NEW    30-JAN-15 08.11.11.803384000 PM 
2    NEW    30-JAN-15 08.11.13.606681000 PM 
1    COMPLETED   30-JAN-15 08.11.15.997794000 PM 
2    COMPLETED   30-JAN-15 08.11.16.469299000 PM 

Я хочу добиться двух вещей:

  1. разницу Отметка времени для каждого идентификатора от статуса нового для завершения
  2. Среднее время между новым для завершения для всех идентификаторов между нов. По завершении

Есть ли лучший способ достичь этого?

+0

Есть только 1 запись для статуса 'New' или' Completed' для каждого уникального 'id'? – SoulTrain

+0

есть. 1 запись для новых и 1 запись для завершенных для каждого id – skhprabu

ответ

0

Если у вас есть только две строки для каждого идентификатора и «нового» предшествует «полный», то вы можете просто сделать это, чтобы получить разницу для каждого ID:

select id, max(timestamp) - min(timestamp) 
from dbtable t 
group by id; 

или связанный запрос, чтобы получить в среднем:

select avg(diff) 
from (select id, max(timestamp) - min(timestamp) as diff 
     from dbtable t 
     group by id 
    ) t; 

Различия измеряются в днях и их частичной части.

+0

Второй запрос работает нормально. хотя я получаю сообщение об ошибке на первом. ORA-00932: непоследовательные типы данных: ожидаемый NUMBER получил INTERVAL DAY TO SECOND 00932. 00000 - «непоследовательные типы данных: ожидаемый% s получил% s» – skhprabu

0

Это поможет вам начать:

SELECT ID 
, (TO_TIMESTAMP(NEWTS, 'DD-Mon-RR HH:MI:SS.FF AM') - TO_TIMESTAMP(COMTS, 'DD-Mon-RR HH:MI:SS.FF AM')) DIFF 
FROM (select 
MIN(case when status='NEW' 
THEN TIMESTAMP 
end) NEWTS, 
MIN(case when status='COMPLETED' 
THEN TIMESTAMP 
end) COMTS 
, ID 
FROM Table1 
GROUP BY ID) A 

Вы могли бы сделать AVG на этот запрос, чтобы получить ваш 2-й ответа

+0

Я не хорошо разбираюсь в plSql, поэтому логика 'to_TIMESTAMP' может быть немного выключена , подтвердите пожалуйста. – SoulTrain

0

Это возвращает разницу в минутах.

p.s : not tested 


SELECT N.ID, 
(24*60)*(C.TIMESTAMP - N.TIMESTAMP) AS DIFF_IN_MINUTES 
FROM 
(SELECT ID, TIMESTAMP 
    FROM TABLE_NAME 
    WHERE STATUS = 'NEW' 
)N 
INNER JOIN 
(SELECT ID, TIMESTAMP 
    FROM TABLE_NAME 
    WHERE STATUS = 'COMPLETED' 
)C 
ON N.ID = C.ID 
Смежные вопросы