2012-11-08 9 views
6

Chcę zaktualizować dolny/ostatni wiersz w mojej tabeli. Ja staram się realizować this rozwiązanie, ale nic nie wydaje się poprawną składnię:T-SQL Jak zaktualizować tylko dolny/ostatni wiersz?

UPDATE TOP(1) @ResultTable 
SET PeriodLastDate=DATEADD(DAY,-1,PeriodLastDate) 
ORDER BY PeriodID DESC 

LUB

UPDATE TOP(1) @ResultTable 
SET PeriodLastDate=DATEADD(DAY,-1,PeriodLastDate) 
FROM @ResultTable 
ORDER BY PeriodID DESC 

Co mam do teraz pracuje jest:

UPDATE @ResultTable 
SET PeriodLastDate=DATEADD(DAY,-1,PeriodLastDate) 
WHERE PeriodID=(SELECT COUNT(PeriodID) FROM @ResultTable)-1 

ale to nie zawsze działa, jak w mojej funkcji niektóre rekordy są usuwane i nie zawsze mam PeriodIDs inkrementowane z 1.

Odpowiedz

15
;WITH CTE AS 
( 
SELECT TOP 1 * 
FROM @ResultTable 
ORDER BY PeriodID DESC 
) 
UPDATE CTE SET PeriodLastDate=DATEADD(DAY,-1,PeriodLastDate) 
5

W pytaniu brakuje kontekstu, aby udzielić odpowiedzi kuloodpornej. W oparciu o twoje działające rozwiązanie, a może zamiast szukać wyliczenia maksymalnej wartości PeriodID? Dopóki kolejne identyfikatory PeriodID mają większą wartość, powinny działać, aby uzyskać "ostatni" rekord.

UPDATE @ResultTable 
SET PeriodLastDate=DATEADD(DAY,-1,PeriodLastDate) 
WHERE PeriodID=(SELECT MAX(PeriodID) FROM @ResultTable) 
1

Jeśli masz niepowtarzalną kolumnę (może PeriodID?) W każdym wierszu można zrobić coś takiego:

UPDATE @ResultTable 
SET PeriodLastDate=DATEADD(DAY,-1,PeriodLastDate) 
where <unique column> = (select top 1 <unique column> 
    from @ResultTable 
    order by PeriodID desc 
) 
Powiązane problemy