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

SQL:Wybierz najnowszą wartość sekwencyjnie odmienną z grupowaniem

Hmmm . . . Jedną z metod jest uzyskanie ostatniej wartości. Następnie wybierz wszystkie ostatnie wiersze z tą wartością i zagreguj:

select min(rownum), colA, colB
from (select t.*,
             first_value(colA) over (partition by colB order by rownum desc) as last_colA
      from t
     ) t
where rownum > all (select t2.rownum
                    from t t2
                    where t2.colB = t.colB and t2.colA <> t.last_colA
                   )
group by colA, colB;

Lub bez agregacji:

select t.*
from (select t.*,
             first_value(colA) over (partition by colB order by rownum desc) as last_colA,
             lag(colA) over (partition by colB order by rownum) as prev_clA
      from t
     ) t
where rownum > all (select t2.rownum
                    from t t2
                    where t2.colB = t.colB and t2.colA <> t.last_colA
                   ) and
      (prev_colA is null or prev_colA <> colA);

Ale w SQL Server 2008 potraktujmy to jako problem z lukami i wyspami:

select t.*
from (select t.*,
             min(rownum) over (partition by colB, colA, (seqnum_b - seqnum_ab) ) as min_rownum_group,
             max(rownum) over (partition by colB, colA, (seqnum_b - seqnum_ab) ) as max_rownum_group
      from (select t.*,
                   row_number() over (partition by colB order by rownum) as seqnum_b,
                   row_number() over (partition by colB, colA order by rownum) as seqnum_ab,
                   max(rownum) over (partition by colB order by rownum) as max_rownum
            from t
           ) t
     ) t
where rownum = min_rownum_group and  -- first row in the group defined by adjacent colA, colB
      max_rownum_group = max_rownum  -- last group for each colB;

Identyfikuje każdą z grup za pomocą różnicy numerów wierszy. Oblicza maksymalną liczbę wierszy dla grupy i ogólnie w danych. To samo dotyczy ostatniej grupy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Haszowanie hasła do SQL

  2. Musisz zadeklarować zmienną skalarną @Id?

  3. SQL Server i niejawna konwersja typów

  4. Przekaż zmienną do wyzwalacza

  5. Znajdź TYLKO wielkie litery w słowie za pomocą zapytania w SQL Server