sql >> Databáze >  >> RDS >> Sqlserver

Vybírejte horní řádky, dokud se hodnota v konkrétním sloupci nezobrazí dvakrát

Kroky:

  1. Vytvořte číslo řádku rn , přes všechny řádky v případě id není v pořadí.
  2. Vytvořte číslo řádku, approv_rn , rozdělené podle EmailApproved takže víme, kdy EmailApproved = 1 podruhé
  3. Použijte outer apply najít číslo řádku second instance EmailApproved = 1
  4. V where klauzule odfiltrovat všechny řádky, kde je číslo řádku >= hodnotu nalezenou v kroku 3.
  5. Pokud je 1 nebo 0 EmailApproved záznamy dostupné, pak outer apply vrátí hodnotu null, v takovém případě vrátí všechny dostupné řádky.
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. Zřetězit a seskupit více řádků v Oracle

  2. Laravel:Osévání více jedinečných sloupců pomocí Faker

  3. SQL Server 2008:Jak udělím oprávnění uživatelskému jménu?

  4. návrh databáze pro nastavení upozornění