Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gruppieren Sie Daten nach Änderung des Gruppierungsspaltenwerts in der Reihenfolge

Es gibt eine (mehr oder weniger) bekannte Technik zur Lösung dieser Art von Problem, die zwei ROW_NUMBER() Aufrufe wie folgt:

WITH marked AS (
  SELECT
    *,
    grp = ROW_NUMBER() OVER (PARTITION BY product        ORDER BY date)
        - ROW_NUMBER() OVER (PARTITION BY product, price ORDER BY date)
  FROM #ph
)
SELECT
  product,
  date_from = MIN(date),
  date_to   = MAX(date),
  price
FROM marked
GROUP BY
  product,
  price,
  grp
ORDER BY
  product,
  MIN(date)

Ausgabe:

product  date_from   date_to        price 
-------  ----------  -------------  ----- 
1        2012-01-01  2012-01-04     1     
1        2012-01-05  2012-01-08     2     
1        2012-01-09  2012-01-12     1