sql >> Database >  >> RDS >> Sqlserver

Groepeer gegevens door de waarde van de groeperingskolom in volgorde te wijzigen

Er is een (min of meer) bekende techniek om dit soort problemen op te lossen, met twee ROW_NUMBER() oproepen, zoals deze:

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)

Uitgang:

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. MySQL werkt nullable datumkolom bij naar NULL

  2. Recursie gebruiken om navigatie te bouwen

  3. Triggers en tafelvergrendeling in MySQL

  4. datum/tijd Conversie tussen verschillende tijdzones