DELETE
FROM mytable
FROM mytable mto
WHERE instant <
(
SELECT DATEADD(hour, -1, MAX(instant))
FROM mytable mti
WHERE mti.foreignid = mto.foreignid
)
note à double FROM
clause, il est sur le but, sinon vous ne serez pas en mesure de créer un alias de la table vous supprimez de.
Les données d'échantillon pour vérifier:
DECLARE @mytable TABLE
(
id INT NOT NULL PRIMARY KEY,
instant DATETIME NOT NULL,
foreignID INT NOT NULL
)
INSERT
INTO @mytable
SELECT 1, '2009-22-07 10:00:00', 1
UNION ALL
SELECT 2, '2009-22-07 09:30:00', 1
UNION ALL
SELECT 3, '2009-22-07 08:00:00', 1
UNION ALL
SELECT 4, '2009-22-07 10:00:00', 2
UNION ALL
SELECT 5, '2009-22-07 08:00:00', 2
UNION ALL
SELECT 6, '2009-22-07 07:30:00', 2
DELETE
FROM @mytable
FROM @mytable mto
WHERE instant <
(
SELECT DATEADD(hour, -1, MAX(instant))
FROM @mytable mti
WHERE mti.foreignid = mto.foreignid
)
SELECT *
FROM @mytable
1 2009-07-22 10:00:00.000 1
2 2009-07-22 09:30:00.000 1
4 2009-07-22 10:00:00.000 2
Je pensais depuis longtemps que ça fonctionnait, mais malheureusement, votre requête ne fait rien. –
@Jader: voir la mise à jour de la publication avec des exemples de données. – Quassnoi
Désolé. Il ne fonctionnait pas à cause de certains champs nuls, maintenant avec isnull (nullableField, -1) au bon endroit cela fonctionne –