Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wybieraj górne wiersze, aż wartość w określonej kolumnie pojawi się dwukrotnie

Kroki:

  1. Utwórz numer wiersza, rn , we wszystkich wierszach w przypadku id nie jest w kolejności.
  2. Utwórz numer wiersza, approv_rn , podzielone według EmailApproved więc wiemy, kiedy EmailApproved = 1 po raz drugi
  3. Użyj outer apply aby znaleźć numer wiersza second wystąpienie EmailApproved = 1
  4. W where klauzula odfiltrowuje wszystkie wiersze, w których numer wiersza to >= wartość znaleziona w kroku 3.
  5. Jeśli jest 1 lub 0 EmailApproved dostępne rekordy, a następnie outer apply zwróci null, w którym to przypadku zwróci wszystkie dostępne wiersze.
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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć tabelę w SQL Server za pomocą zapytania

  2. 3 sposoby na uzyskanie listy baz danych w SQL Server (T-SQL)

  3. T-sql, kleszcze, znacznik czasu

  4. Czy istnieje sposób na wyłączenie wyzwalacza programu SQL Server tylko dla określonego zakresu wykonania?

  5. Znajdowanie jednoczesnych zdarzeń w bazie danych między czasami