Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Sélectionnez les premières lignes jusqu'à ce que la valeur dans une colonne spécifique apparaisse deux fois

Étapes :

  1. Créez un numéro de ligne, rn , sur toutes les lignes au cas où id n'est pas dans l'ordre.
  2. Créez un numéro de ligne, approv_rn , partitionné par EmailApproved donc nous savons quand EmailApproved = 1 pour la deuxième fois
  3. Utilisez une outer apply pour trouver le numéro de ligne du second instance de EmailApproved = 1
  4. Dans le where clause filtre toutes les lignes où le numéro de ligne est >= la valeur trouvée à l'étape 3.
  5. S'il y a 1 ou 0 EmailApproved enregistrements disponibles puis l'outer apply renverra null, auquel cas renverra toutes les lignes 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;