/ / Dodanie kolumny Data na podstawie wartości daty następnego wiersza - sql, sql-server-2005

Dodawanie kolumny Data na podstawie wartości daty następnego rzędu - sql, sql-server-2005

Używam SQL Server 2005. Z poniższej tabeli tbl_temp chciałbym dodać kolumnę EndDate na podstawie StartDate następnego wiersza minus 1 dzień, dopóki nie nastąpi zmiana kombinacji AID i UID. Obliczona data zakończenia będzie przechodzić do wiersza nad nią jako data zakończenia. Ostatni wiersz grupy AID i UID otrzyma datę systemową jako datę końcową. Tabela musi być uporządkowana według kolejności AID, UID, StartDate. Dzięki za pomoc.

- tbl_temp

AID UID StartDate 1 1 2013-02-20 2 1 2013-02-06 1 1 2013-02-21 1 1 2013-02-27 1 2 2013-02-02 1 2 2013-02-04

- Potrzebny wynik

POMOC UID StartDate EndDate 1 12013-02-20 2013-02-20 1 1 2013-02-21 2013-02-26 1 1 2013-02-27 sysdate 1 2 2013-02-02 2013-02-03 1 2 2013-02-04 sysdate 2 1 2013-02-06 sysdate

Odpowiedzi:

1 dla odpowiedzi № 1

Najłatwiej to zrobić za pomocą skorelowanego podkwerendy:

select t.*,
(select top 1 dateadd(day, -1, startDate )
from tbl_temp t2
where t2.aid = t.aid and
t2.uid = t.uid and
t2.startdate > t.startdate
) as endDate
from tbl_temp t

Aby uzyskać bieżącą datę, użyj isnull():

select t.*,
isnull((select top 1 dateadd(day, -1, startDate )
from tbl_temp t2
where t2.aid = t.aid and
t2.uid = t.uid and
t2.startdate > t.startdate
), getdate()
) as endDate
from tbl_temp t

Normalnie polecam coalesce() koniec isnull(). Jednak w niektórych wersjach SQL Server występuje błąd, w którym ocenia dwa razy pierwszy argument. Zwykle nie robi to różnicy, ale robi to przy podzapytaniu.

I wreszcie użycie sysdate przywodzi mi na myśl Oracle. Tam też zadziała to samo podejście.


1 dla odpowiedzi nr 2
;WITH x AS
(
SELECT AID, UID, StartDate,
ROW_NUMBER() OVER(PARTITION BY AID, UID ORDER BY StartDate) AS rn
FROM tbl_temp
)
SELECT x1.AID, x1.UID, x1.StartDate,
COALESCE(DATEADD(day,-1,x2.StartDate), CAST(getdate() AS date)) AS EndDate
FROM x x1
LEFT OUTER JOIN x x2 ON x2.AID = x1.AID AND x2.UID = x1.UID
AND x2.rn = x1.rn + 1
ORDER BY x1.AID, x1.UID, x1.StartDate

Przykład Fiddle SQL