Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Seleziona le prime righe fino a quando il valore nella colonna specifica non viene visualizzato due volte

Passi:

  1. Crea un numero di riga, rn , su tutte le righe nel caso id non è in sequenza.
  2. Crea un numero di riga, approv_rn , partizionato da EmailApproved quindi sappiamo quando EmailApproved = 1 per la seconda volta
  3. Utilizza un outer apply per trovare il numero di riga del second istanza di EmailApproved = 1
  4. Nel where la clausola filtra tutte le righe in cui il numero di riga è >= il valore trovato nel passaggio 3.
  5. Se è presente 1 o 0 EmailApproved record disponibili, quindi outer apply restituirà null, nel qual caso restituirà tutte le righe disponibili.
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;