sql >> Databasteknik >  >> RDS >> Sqlserver

Gruppera data genom att ändra grupperingskolumnens värde i ordning

Det finns en (mer eller mindre) känd teknik för att lösa den här typen av problem, som involverar två ROW_NUMBER() samtal, så här:

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)

Utdata:

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     


  1. Hur man använder OR &AND i WHERE-satsen i mysql

  2. MySQL returnerar exakt ordmatchning från textinnehåll

  3. Best Practices för PostgreSQL-revisionsloggning

  4. Kasta millisekundsdelen från tidsstämpeln