Zastanawiam się, czy ktoś może mi pomóc z tym oświadczeniem SQL?t-SQL do aktualizacji tabeli w celu usunięcia nakładających się ramek czasowych
Powiedz, mam tabeli SQL Server 2008 jak poniżej:
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
muszę usunąć dowolny czas zachodzi w powyższej tabeli. Można to zilustrować z tym schematem:
Więc wymyśliłem tego SQL:
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
Ale to nie działa. Masz pojęcie, co tu robię źle?
**** EDIT ****
OK, zajęło mi trochę czasu, aby dostać się do tego. Wydaje się, że SQL pracuje na co muszę go:
--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;
Dzięki. Muszę to wypróbować. Tylko z ciekawości, jakiej książki i gdzie w niej jest odniesienie do kodu, o którym wspomniałeś? – ahmd0
Myślę, że rozdział 29 z Joe Celko's SQL for Smarties: Advanced SQL Programming. Widziałem spis treści, a nie rozdziały. – shawnt00
Również w przypadku tego samego sprawdzania wiersza nie będzie łatwiej sprawdzać kolumnę id? – ahmd0