[MSSQL] Update biorąc pod uwagę lp. rekordu lub poprzedni

0

Cześć, już tłumaczę o co chodzi.

Mam tabelę:

ID - klucz główny
EID - id osoby
date - data
type - wartość 0, lub 1
iwt - wartość 0, lub 1.

Teraz tak, chodzi o to, żeby jednym zapytaniem(a przynajmniej nie procedurą składowaną) zupdateować rekordy w następujący sposób:

type = 0 jeśli (poprzedni_rekord.type = 1 lub poprzedni_rekord.type is null)
type = 1 jeśli (poprzedni_rekord.type = 0)
iwt = 1 jeśli type = 0
iwt = 0 jeśli type = 1

Oczywiście chodzi o to, żeby "zgrupować" to po polu eid.

Przykład, jak ma wyglądać wynik

eid     |     date         |  type  |  iwt  
--------------------------------------
1       | 2009-01-01 08:00 |    0     |   1  
1       | 2009-01-01 12:00 |    1     |   0
1       | 2009-01-01 13:00 |    0     |   1
2       | 2009-01-01 08:00 |    0     |   1
2       | 2009-01-01 15:00 |    1     |   0
1       | 2009-01-02 08:00 |    0     |   1

itd.

Mam nadzieję, że jasno to wyjaśniłem.
Da się to zrobić za pomocą jednego update'u?
Jeśli tak, to w jaki sposób?

0

Zależy od bazy danych. Jeśli Twoja baza obsługuję funkcję zwracającą numer kolejnego rekordu sprawa jest prosta. Przykładowe zapytanie dla Sybase ASA zwracające naprzemiennie zera i jedynki dla każdego wiersza tabeli:

SELECT number(*) - number(*)/2*2 FROM tabela

0

Nie doczytałem w tytule informacji o bazie danych. W MS SQL jest funkcja ROW_NUMBER().

0
hes napisał(a)

Nie doczytałem w tytule informacji o bazie danych. W MS SQL jest funkcja ROW_NUMBER().

Tak wiem, ale nie wiem, jak skonstruować takie zapytanie. Robię sobie select na razie, w którym mam aktualny i poprzedni rekord, ale on się wykonuje już ponad 3 minuty i dalej trwa :)
(rekordów 20 tysięcy)

[dopisane]
Jednak muszę sprawdzać zgodnie z poprzednim rekordem, a nie row_number

1 użytkowników online, w tym zalogowanych: 0, gości: 1