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

Vælg de øverste rækker, indtil værdien i den specifikke kolonne er dukket op to gange

Trin:

  1. Opret et rækkenummer, rn , over alle rækker i tilfælde id er ikke i rækkefølge.
  2. Opret et rækkenummer, approv_rn , opdelt af EmailApproved så vi ved hvornår EmailApproved = 1 for anden gang
  3. Brug en outer apply for at finde rækkenummeret for second forekomst af EmailApproved = 1
  4. I where klausul filtrere alle rækker ud, hvor rækkenummeret er >= værdien fundet i trin 3.
  5. Hvis der er 1 eller 0 EmailApproved tilgængelige poster, så outer apply vil returnere null, i hvilket tilfælde returnerer alle tilgængelige rækker.
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. CodeIgniter aktive posters problemer med at kalde flere lagrede procedurer

  2. io.vertx.mysqlclient.MySQLPool.query ().execute udføres aldrig rigtigt og returnerer intet

  3. Oracle Eksport/Import problemer med Tablespace

  4. Hvordan bruger man et funktionsbaseret indeks på en kolonne, der indeholder NULL'er i Oracle 10+?