Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL :sélectionnez la valeur séquentiellement distincte la plus récente avec regroupement

Hmmm . . . Une méthode consiste à obtenir la dernière valeur. Choisissez ensuite toutes les dernières lignes avec cette valeur et agrégez :

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;

Ou, sans l'agrégation :

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

Mais dans SQL Server 2008, traitons cela comme un problème d'espaces et d'îlots :

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;

Cela identifie chacun des groupes en utilisant une différence de numéros de ligne. Il calcule le rownum maximum pour le groupe et globalement dans les données. Ce sont les mêmes pour le dernier groupe.