Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Групирайте данните по реда на промяна на стойността на колоната за групиране

Има (повече или по-малко) известна техника за решаване на този вид проблем, включваща два ROW_NUMBER() обаждания, като това:

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)

Изход:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам псевдоним в клаузата where?

  2. Как да задам име на таблица в динамична SQL заявка?

  3. как да разделя низ в различни колони?

  4. В SQL Server 2005, как да получите таблици в други бази данни от кой изглед зависи?

  5. Типове курсори на SQL Server - Динамичен курсор само за препращане | Урок за SQL Server / Урок за TSQL