SQL Server meilleure façon de calculer datediff entre le courant de ligne et la ligne suivante?

StackOverflow https://stackoverflow.com/questions/52430

  •  09-06-2019
  •  | 
  •  

Question

J'ai suivantes approximative de la structure:

Object -> Object Revisions -> Data

Les Données peuvent être partagées entre plusieurs Objets.

Ce que j'essaie de faire est de nettoyer l'ancien Objet de Révisions.Je veux garder la première, actif, et un écart de révisions, de sorte que le dernier changement pour une période de temps est conservé.Les Données sont susceptibles d'être beaucoup changé au cours de 2 jours, puis laissé seul pendant des mois, donc je veux garder la dernière révision avant les changements ont commencé et la fin du changement de la nouvelle série.

Je suis actuellement à l'aide d'un curseur et de la table temporaire pour contenir l'Id et la date entre les changements afin que je puisse sélectionner les fruits mûrs de se débarrasser de.Cela signifie en utilisant @LastID, @ "LastDate", les mises à jour et insère à la table temp, etc...

Est-il un moyen plus facile/mieux pour calculer la date de la différence entre le courant de ligne et la ligne suivante dans mon premier ensemble de résultats sans l'aide d'un curseur et de la table temporaire?

Je suis sur sql server 2000, mais serait intéressé par toutes les nouvelles fonctionnalités de 2005, 2008 qui pourrait aider avec cela aussi.

Était-ce utile?

La solution

Si la colonne d'identité est séquentiel, vous pouvez utiliser cette méthode:

SELECT curr.*, DATEDIFF(MINUTE, prev.EventDateTime,curr.EventDateTime) Duration FROM DWLog curr join DWLog prev on prev.EventID = curr.EventID - 1

Autres conseils

Ici est un exemple de SQL.Si vous avez une colonne d'Identité, vous pouvez l'utiliser au lieu de "ActivityDate".

SELECT DATEDIFF(HOUR, prev.ActivityDate, curr.ActivityDate)
  FROM MyTable curr
  JOIN MyTable prev
    ON prev.ObjectID = curr.ObjectID
  WHERE prev.ActivityDate =
     (SELECT MAX(maxtbl.ActivityDate)
        FROM MyTable maxtbl
        WHERE maxtbl.ObjectID = curr.ObjectID
          AND maxtbl.ActivityDate < curr.ActivityDate)

J'ai pu supprimer "prev", mais là si vous avez besoin de Id pour la suppression.

Mmdp, défi intéressant.Je pense que vous pouvez le faire sans une auto-jointure si vous utilisez la nouvelle-à-2005 pivot de la fonctionnalité.

Voici ce que j'ai obtenu jusqu'à présent, j'ai voulu donner un peu plus de temps avant d'accepter une réponse.

DECLARE @IDs TABLE 
(
  ID int , 
  DateBetween int
)

DECLARE @OID int
SET @OID = 6150

-- Grab the revisions, calc the datediff, and insert into temp table var.

INSERT @IDs
SELECT ID, 
       DATEDIFF(dd, 
                (SELECT MAX(ActiveDate) 
                 FROM ObjectRevisionHistory 
                 WHERE ObjectID=@OID AND 
                       ActiveDate < ORH.ActiveDate), ActiveDate) 
FROM ObjectRevisionHistory ORH 
WHERE ObjectID=@OID


-- Hard set DateBetween for special case revisions to always keep

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MIN(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MAX(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 
 WHERE ID=(SELECT ID 
           FROM ObjectRevisionHistory 
           WHERE ObjectID=@OID AND Active=1)


-- Select out IDs for however I need them

 SELECT * FROM @IDs
 SELECT * FROM @IDs WHERE DateBetween < 2
 SELECT * FROM @IDs WHERE DateBetween > 2

Je suis à la recherche de prolonger ce que je puisse garder au maximum afin de nombreuses révisions, et couper les plus anciennes, tout en gardant toujours la première, la dernière, et active.Devrait être assez facile à travers sélectionnez haut et des clauses order by, euh...et en jetant dans ActiveDate dans la table temporaire.

Je me suis Peter de l'exemple de travailler, mais qui a pris et l'a modifié dans une sous-sélection.J'ai foiré autour avec les deux, et la trace sql montre celle-ci fait moins de lectures.Mais il fonctionne et je vais voter quand je reçois mon rep assez élevé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top