Mam poniższą tabelę. Potrzeba sql, Jeśli nastąpi zmiana wartości INPUT, zaktualizuj FLAGĘ do 1 innego 0.

INPUT   START_DATE  PERSON_ID  FLAG
42707   2017-01-01  227317      0
40000   2018-01-01  227317      1
42400   2019-01-01  227317      1
42400   2019-01-02  227317      0 
0
at9063 19 grudzień 2019, 15:31
W Twoich danych input jest unikalny dla danej osoby, więc zaznaczasz tylko, czy wiersz jest pierwszym wierszem, czy nie.
 – 
Gordon Linoff
19 grudzień 2019, 15:34
Teraz możesz sprawdzić, czy od 2019-01-01 do 2019-01-02 nie ma zmian w INPUT, więc jego flaga powinna wynosić 0
 – 
at9063
19 grudzień 2019, 15:42

2 odpowiedzi

Jeśli chcesz to w zapytaniu, użyj row_number():

select t.*,
       (case when row_number() over (partition by person_id order by start_date) = 1
             then 0 else 1
        end) as flag
from t;

Jeśli input_value może być taki sam w różnych wierszach, użyj first_value():

select t.*,
       (case when value <> first_value(input) over (partition by person_id order by start_date) = 1
             then 0 else 1
        end) as flag
from t;

Każdy formularz może zostać włączony do update przy użyciu aktualizowalnego CTE, jeśli chcesz zaktualizować tabelę.

EDYTOWAĆ:

Jeśli chcesz wiedzieć, czy wartość zmienia się z jednego wiersza na „następny”, użyj lag(). W update wygląda to tak:

with toupdate as (
      select t.*,
             lag(input) over (partition by customerid order by date) as prev_input
      from t
     )
update toupdate
    set flag = (case when prev_input <> input then 1 else 0 end);

To powiedziawszy, nie radziłbym przechowywać danych w tabeli. Zamiast tego po prostu umieść logikę w select, kiedy jej potrzebujesz. W przeciwnym razie dane mogą stać się nieaktualne, jeśli wartość historyczna zostanie zaktualizowana.

1
Gordon Linoff 19 grudzień 2019, 16:28
Możesz sprawdzić od 2019-01-01 do 2019-01-02 nie ma zmian w INPUT, więc jego flaga powinna wynosić 0
 – 
at9063
19 grudzień 2019, 15:42
Jakaś metoda bez użycia funkcji opóźnienia?
 – 
at9063
25 grudzień 2019, 08:25
. . . Wszystkie obsługiwane wersje SQL Server obsługują lag(), więc nie rozumiem Twojego komentarza.
 – 
Gordon Linoff
25 grudzień 2019, 17:17

Możesz użyć lag():

select t.*, 
       (case when lag(input, 1, input) over (partition by person_id order by start_date) = input
             then 0 else 1 
        end) as FLAG
from table t;
1
Yogesh Sharma 19 grudzień 2019, 15:50