SQL Server meilleure façon de calculer datediff entre le courant de ligne et la ligne suivante?
-
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.
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é.