2013-06-27 1 views
0

J'ai un ensemble de valeurs de date dans Oracle que je suis en train de faire un ORDER BY START_TIME, STOP_TIME comme dans l'exemple de données ci-dessous. La colonne intitulée NEXT_START_TIME, comme vous pouvez le voir, est récupérée via la fonction LEAD().Gestion des calculs de plage de dates sur plusieurs lignes sans bouclage

 
START_TIME  STOP_TIME  NEXT_START_TIME 
6/13/2013 5:19 6/13/2013 5:34 6/13/2013 5:19 -- no delay, OK 
6/13/2013 5:19 6/13/2013 6:23 6/13/2013 5:39 
6/13/2013 5:39 6/13/2013 6:04 6/13/2013 6:23 -- delay? wrong 
6/13/2013 6:23 6/13/2013 7:32 6/13/2013 9:18 
6/13/2013 9:18 6/13/2013 9:50 6/13/2013 9:44 
6/13/2013 9:44 6/13/2013 10:01 

Ces données représentent des emplois assignés. La tâche difficile que j'ai est, de la manière la plus efficace, comment déterminer s'il y avait un retard dans l'attribution d'un travail. La première entrée ne représente aucun délai puisque le NEXT_START_TIME est arrivé avant le STOP_TIME. Seulement dans les cas où le NEXT_START_TIME est arrivé après le STOP_TIME pouvons-nous considérer qu'il y a un délai (comme dans la troisième rangée).
La ride est que même si la troisième rangée semble indiquer un retard, ce n'est pas correct. Même si le NEXT_START_TIME était à 6:23, il doit être conscient du fait qu'un travail précédent était encore en cours (voir les deux articles en surbrillance).
Existe-t-il un moyen d'accomplir ceci sans O (N), ou pire, des itérations? À l'heure actuelle, l'utilisation de la fonction LEAD() est très efficace.
S'il vous plaît demander des éclaircissements si nécessaire, car je sais que cela peut être difficile à comprendre.

Répondre

3

Au lieu de lead(), vous voulez un cumul de max. Essayez d'utiliser ce lieu de lead():

select START_TIME, STOP_TIME, 
     max(stop_time) over (order by start_time) as MaxCumStopTime 
from t 

La clause order by indique Oracle de faire une déclaration cumulative, qui prendra au maximum de tout temps jusqu'à cette ligne.

+0

Brillant! Je ne savais pas que MAX() fonctionnerait de cette manière. Il semble prendre le MAX() jusqu'à et y compris la ligne de transition (où les changements de start_time). – McArthey

+0

Est-il possible de laisser les valeurs NULL dans la colonne STOP_TIME comme NULL et de ne pas les "écraser" avec la valeur MAX()? – McArthey