Istnieje stosunkowo skuteczny sposób określenia, czy dane są poprawne — no, prawie. Określi, czy w danych brakuje „1” lub „2”. Ta wersja nie określa, czy pierwszy identyfikator to „1”, ponieważ Twoje pytanie o tym nie wspomina.
Najlepszym rozwiązaniem jest użycie lag()
i lead()
. Jednak SQL Server 2008 nie obsługuje tych funkcji. Więc podejdźmy do tego jako do luki i wysp. Czy są jakieś sytuacje z więcej niż 1 „1” lub „2” w wierszu dla danego id
? Poniższy kod powinien znaleźć te anomalie:
select id, inoutid, count(*) as num_in_row,
from (select t.*,
row_umber() over (partition by id, inoutid order by date, hours, minute) as seqnum_ii,
row_umber() over (partition by id order by date, hours, minute) as seqnum_i
from t
) t
group by id, inoutid, (seqnum_i - seqnum_ii)
having count(*) > 1