Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL:Изберете най-новата последователно различна стойност с групиране

Хммм . . . Един от методите е да получите последната стойност. След това изберете всички последни редове с тази стойност и обобщете:

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;

Или без агрегацията:

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);

Но в SQL Server 2008 нека третираме това като проблем с пропуски и острови:

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;

Това идентифицира всяка от групите с помощта на разлика в номерата на редовете. Той изчислява максималния номер на ред за групата и като цяло в данните. Те са същите за последната група.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. В SSIS как да получа броя на редовете, върнати от източника, които ТРЯБВА да бъдат обработени

  2. Как мога да изтрия дублиращи се редове в таблица

  3. Как да преместя таблица в схема в T-SQL

  4. Как да свържете база данни на Access към SQL Server в Access 2016

  5. Случаен запис от таблица на база данни (T-SQL)