Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wählen Sie die obersten Zeilen aus, bis der Wert in einer bestimmten Spalte zweimal erscheint

Schritte:

  1. Erstellen Sie eine Zeilennummer, rn , über alle Zeilen im Fall id ist nicht in der Reihenfolge.
  2. Erstellen Sie eine Zeilennummer, approv_rn , partitioniert nach EmailApproved damit wir wissen, wann EmailApproved = 1 ist zum zweiten Mal
  3. Verwenden Sie eine outer apply um die Zeilennummer des second zu finden Instanz von EmailApproved = 1
  4. Im where -Klausel filtert alle Zeilen heraus, in denen die Zeilennummer >= ist den in Schritt 3 gefundenen Wert.
  5. Bei 1 oder 0 EmailApproved Aufzeichnungen vorhanden dann gelten die outer apply gibt null zurück, in diesem Fall werden alle verfügbaren Zeilen zurückgegeben.
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;