sql >> Base de Datos >  >> RDS >> Sqlserver

Seleccione las filas superiores hasta que el valor en la columna específica haya aparecido dos veces

Pasos:

  1. Cree un número de fila, rn , sobre todas las filas en el caso de id no está en secuencia.
  2. Cree un número de fila, approv_rn , particionado por EmailApproved para que sepamos cuando EmailApproved = 1 por segunda vez
  3. Usar una outer apply para encontrar el número de fila del second instancia de EmailApproved = 1
  4. En el where la cláusula filtra todas las filas donde el número de fila es >= el valor encontrado en el paso 3.
  5. Si hay 1 o 0 EmailApproved registros disponibles, entonces el outer apply devolverá nulo, en cuyo caso devolverá todas las filas disponibles.
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;