Kroki:
- Utwórz numer wiersza,
rn
, we wszystkich wierszach w przypadkuid
nie jest w kolejności. - Utwórz numer wiersza,
approv_rn
, podzielone wedługEmailApproved
więc wiemy, kiedyEmailApproved = 1
po raz drugi - Użyj
outer apply
aby znaleźć numer wierszasecond
wystąpienieEmailApproved = 1
- W
where
klauzula odfiltrowuje wszystkie wiersze, w których numer wiersza to>=
wartość znaleziona w kroku 3. - Jeśli jest 1 lub 0
EmailApproved
dostępne rekordy, a następnieouter apply
zwróci null, w którym to przypadku zwróci wszystkie dostępne wiersze.
with test as
(
select *,
rn = row_number() over (order by Created desc),
approv_rn = row_number() over (partition by EmailApproved
order by Created desc)
from @Test
)
select *
from test t
outer apply
(
select x.rn
from test x
where x.EmailApproved = 1
and x.approv_rn = 2
) x
where t.rn < x.rn or x.rn is null
order by t.Created desc;