Pobieranie wartości unikalnych, wstawianie gdy poprzednia wartość jest rózna

0

Cześć
mam dane które spływają - dane są z timestampem, nic wielkiego - tag, timestamp, wartość

czy można - ewentualnie jak można - po stronie SQL zrobić takie rzeczy jak
1) INSERT jeśli wartość jest różna od poprzedniej (wartość poprzednia to ta z max timestamp)
2) pobrać tylko wartości unikalne
->timestamp 1|2|3|4|5|6|7
->wartość 1|1|2|3|2|5|2

-> wynik 1|2|3|2|5|2
czyli omijam wartości takie same gdy następują po sobie

O ile po stronie kodu to się da zrobić - iteracja po wyniku i pobieranie
zapis do bazy też jeśli wcześniej byłby odczyt i sprawdzenie czy insert ma pójść czy nie (na razie pomijam, że podczas odczytu zmienila się najnowsza wartość)

Z góry dziękuję za wskazówki, bo próbuję to rozkminić, jak to zrobić po stronie DB (SQL SERVER)

0

http://sqlfiddle.com/#!18/9e42d4/4

select t.log_value
from (select log_value,
             lag(log_value) over (order by log_order desc) as prev_val
      from log
     ) t
where t.prev_val <>t.log_value or prev_val is null;
0

@jakubek:

@Los Bomberos:

Prostota / prymitywizm na wejściu skutkuje bardziej kosztownymi kwerendami odczytującymi. Opłaca się lub nie...
Można rozważyć, czy wyłączyć klucz do innej tabeli, ale nie kumam celów i optymalizacji

jakubek napisał(a):

czy można - ewentualnie jak można - po stronie SQL zrobić takie rzeczy jak

  1. INSERT jeśli wartość jest różna od poprzedniej (wartość poprzednia to ta z max timestamp)
begin 
update ...where ...
if @ROWCOUNT = 0
insert ...
commit

Przy czym update i insert muszą mieć named parameters

Raz użyłem i bardziej żałuję niż się chwalę, dążył bym do lepiej zaprojektowanych struktur danych. W twoim przypadku - jak go rozumiem, że struktura jest mocno prowizoryczna i operacje będa nie optymalne (bez wyrazistych kluczy) - może być tylko gorzej, u mnie where nie musiał kombinować

0
begin 
update ...where ...
if @ROWCOUNT = 0
insert ...
commit

To chyba nie jest bezpieczne dla równoległych sesji, jeśli po update, dla którego rowcount = 0, druga sesja zdąży wstawić wartość.

Raczej coś a'la

insert into dest_table
select (...)
where not exists (select 1
                   from dest_table
                  where value = inserted_value and 
                        order_col_with_timestamp = (select max(order_col_with_timestamp) from dest_table)
                  )

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