2015-03-16 2 views
1

У меня есть таблица и данные, как показано ниже. В этой таблице в столбце «ВРЕМЯ» указано время, в которое вставлены данные. NODE_ENTER указывает, что узел запускается или заканчивается. Когда он равен 1, это означает, что узел запущен, а время начала - app_date и app_time. Когда NODE_ENTER равно 0, это означает, что узел завершен, и теперь app_date и app_time показывают время окончания.Как связать не последовательные данные в отсортированном списке?

Для этой таблицы я хочу получить общее время на каждом узле (для узла start, region_node, где-то и узла sub_region). Но как я могу получить это правильно?

ID  TIME   REFID NODE  NODE_ENTER APP_DATE APP_TIME 
12345 0   10150 start  1   20130605 94601 
23456 3,7093E+11 10150 start  0   20130611 90115 
56789 3,7093E+11 10150 region  1   20130611 90116 
67891 3,72167E+11 10150 sub-region 1   20130625 162419 
23432 3,72171E+11 10150 sub-region 0   20130625 173226 
87656 3,72171E+11 10150 region  0   20130625 173227 
34599 3,72171E+11 10150 somewhere 1   20130625 173227 
87654 3,72237E+11 10150 somewhere 0   20130626 120121 
66789 3,72237E+11 10150 region  1   20130626 120122 
99891 3,72167E+11 10150 sub-region 1   20130627 104537 
21132 3,72346E+11 10150 sub-region 0   20130627 181136 
82356 3,79515E+11 10150 region  0   20130628 162656 

Я использовал функцию LAG, как показано ниже, но я не мог получить разницу во времени между двумя последовательными и одинаковыми именованными строками. Например, узлы региона не являются последовательными, поскольку субрегионы должны быть между двумя узлами региона. Теперь я могу получить разницу во времени между двумя пусковыми узлами или двумя узлами субрегиона, но как я могу получить разницу во времени между двумя узлами региона? Когда я пытался использовать функцию LAG над именем узла, она не работает снова, так как я могу иметь одинаковые имена узлов. Узел Region может начинаться после того, как где-нибудь узел и конец снова.

LAG(P.NODE, 1, '-') OVER(ORDER BY P.REFID,p.time) AS PREV_NODE, 
LAG(P.APP_DATE, 1, '-') OVER(ORDER BY P.REFID,p.time) AS START_DATE, 
LAG(P.APP_TIME, 1, '000000') OVER(ORDER BY P.REFID, p.time) AS START_TIME 

ответ

1

Я думаю, что вы хотите раздел на REFID и NODE в то время как заказ на APP_DATE и APP_TIME:

SELECT ref_id, node, node_enter, app_date, app_time 
    , last_node_enter, last_app_date, last_app_time 
    FROM (
    SELECT p.ref_id, p.node, p.node_enter, p.app_date, p.app_time 
     , LAG(p.node_enter) OVER (PARTITION BY p.ref_id, p.node ORDER BY p.app_date, p.app_time) AS last_node_enter 
     , LAG(p.app_date) OVER (PARTITION BY p.ref_id, p.node ORDER BY p.app_date, p.app_time) AS last_app_date 
     , LAG(p.app_time) OVER (PARTITION BY p.ref_id, p.node ORDER BY p.app_date, p.app_time) AS last_app_time 
     FROM mytable p 
) WHERE node_enter = 1 AND last_node_enter = 0; 

Я бы рекомендовал хранить ваши даты и времени, как DATE с или TIMESTAMP с вместо NUMBER s или VARCHAR2 s.

+0

Вы правы. Мне нужно использовать раздел. Проблема решена. Спасибо большое. – engkok

+0

Я исправил свой ответ, когда я заказывал по колонке 'DESC', который не дал бы правильного результата при использовании' LAG() '. –

+0

Я все равно не использовал его, но еще раз спасибо :) – engkok

Смежные вопросы