Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Selecione as linhas superiores até que o valor na coluna específica apareça duas vezes


Passos:
  1. Crie um número de linha, rn , em todas as linhas caso id não está em sequência.
  2. Crie um número de linha, approv_rn , particionado por EmailApproved para sabermos quando EmailApproved = 1 pela segunda vez
  3. Use um outer apply para encontrar o número da linha do second instância de EmailApproved = 1
  4. No where cláusula filtra todas as linhas em que o número da linha é >= o valor encontrado na etapa 3.
  5. Se houver 1 ou 0 EmailApproved registros disponíveis, então o outer apply retornará 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;