Ich fragte mich, ob mir jemand mit dieser SQL-Anweisung helfen könnte?t-SQL, um Tabelle zu aktualisieren, um überlappende Zeitrahmen zu entfernen
Sag mal, ich habe eine SQL Server 2008-Tabelle wie folgt aus:
id -- INT PRIMARY KEY
dtIn -- DATETIME2
dtOut -- DATETIME2
type -- INT
id dtIn dtOut type
1 05:00 10:00 1
2 08:00 16:00 2
3 02:00 08:00 1
4 07:30 11:00 1
5 07:00 12:00 2
Ich brauche jederzeit zu entfernen, in der Tabelle oben überlappt. Dies kann mit diesem Diagramm veranschaulicht werden:
So kam ich mit dieser SQL-up:
UPDATE [table] AS t
SET dtOut = (SELECT MIN(dtIn) FROM [table] WHERE type = t.type AND t.dtIn >= dtIn AND t.dtIn < dtOut)
WHERE type = t.type AND t.dtIn >= dtIn AND t.dtIn < dtOut
Aber es funktioniert nicht. Irgendeine Idee, was mache ich hier falsch?
**** EDIT ****
OK, es dauerte eine Weile, um mich zu diesem zu erhalten. Scheint für eine funktionierende SQL zu sein, was ich brauche es für:
--BEGIN TRANSACTION;
--delete identical dtIn
DELETE dT1
FROM tbl dT1
WHERE EXISTS
(
SELECT *
FROM tbl dT2
WHERE dT1.Type = dT2.Type
AND dT1.dtIn = dT2.dtIn
AND (
dT1.dtOut < dT2.dtOut
OR (dT1.dtOut = dT2.dtOut AND dT1.id < dT2.id)
)
);
--adjust dtOuts to the max dates for overlapping section
UPDATE tbl
SET dtOut = COALESCE((
SELECT MAX(dtOut)
FROM tbl as t1
WHERE t1.type = tbl.type
AND t1.dtIn < tbl.dtOut
AND t1.dtOut > tbl.dtIn
), dtOut);
-- Do the actual updates of dtOut
UPDATE tbl
SET dtOut = COALESCE((
SELECT MIN(dtIn)
FROM tbl as t2
WHERE t2.type = tbl.type AND
t2.id <> tbl.id AND
t2.dtIn >= tbl.dtIn AND t2.dtIn < tbl.dtOut
), dtOut);
--COMMIT TRANSACTION;
Dank. Ich muss es ausprobieren. Nur aus Neugier, welches Buch und wo drin ist die von Ihnen erwähnte Code-Referenz? – ahmd0
Ich denke Kapitel 29 von Joe Celko SQL für Smarties: Advanced SQL-Programmierung. Ich konnte das Inhaltsverzeichnis nicht die Kapitel sehen. – shawnt00
Auch für die gleiche Zeile überprüfen, wäre es nicht einfacher, ID-Spalte stattdessen zu überprüfen? – ahmd0