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

SQL:Vyberte poslední sekvenčně odlišnou hodnotu se seskupením

Hmmm . . Jednou z metod je získání poslední hodnoty. Poté vyberte všechny poslední řádky s touto hodnotou a agregujte:

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;

Nebo bez agregace:

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 v SQL Server 2008 to berme jako problém s mezerami a ostrovy:

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;

To identifikuje každou ze skupin pomocí rozdílu čísel řádků. Vypočítá maximální rownum pro skupinu a celkově v datech. Ty jsou stejné pro poslední skupinu.




  1. Chyba 'Samopodepsaný certifikát' během dotazu na databázi Postgres hostovanou Heroku z aplikace Node.js

  2. Detekce událostí spánku a probuzení OS v Javě

  3. Pole MySQL DATE s výchozí CURDATE(). NE DATETIME

  4. Postgres SQL Query pro shrnutí dat o chybách