sql >> Database >  >> RDS >> Sqlserver

Selecteer de bovenste rijen totdat de waarde in de specifieke kolom twee keer is verschenen

Stappen:

  1. Maak een rijnummer, rn , over alle rijen voor het geval id staat niet op volgorde.
  2. Maak een rijnummer, approv_rn , gepartitioneerd door EmailApproved zodat we weten wanneer EmailApproved = 1 voor de tweede keer
  3. Gebruik een outer apply om het rijnummer van de second . te vinden instantie van EmailApproved = 1
  4. In de where clausule filtert alle rijen uit waar het rijnummer is >= de waarde gevonden in stap 3.
  5. Als er 1 of 0 is EmailApproved records beschikbaar, dan zijn de outer apply retourneert null, in welk geval alle beschikbare rijen worden geretourneerd.
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;



  1. mysql refererende sleutelreferentie van een samengestelde sleutel

  2. Converteer Java-bytearray naar Python-bytearray

  3. mySql federatieve tabel kan blob-kolommen niet bijwerken

  4. CakePHP zal niet groeperen op voorwaarde