Passos:
- Crie um número de linha,
rn, em todas as linhas casoidnão está em sequência. - Crie um número de linha,
approv_rn, particionado porEmailApprovedpara sabermos quandoEmailApproved = 1pela segunda vez - Use um
outer applypara encontrar o número da linha dosecondinstância deEmailApproved = 1 - No
wherecláusula filtra todas as linhas em que o número da linha é>=o valor encontrado na etapa 3. - Se houver 1 ou 0
EmailApprovedregistros disponíveis, então oouter applyretornará null e, nesse caso, retornará todas as linhas disponíveis.
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;