Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Grupuj dane poprzez zmianę wartości kolumny grupującej w kolejności

Istnieje (mniej lub bardziej) znana technika rozwiązywania tego rodzaju problemów, obejmująca dwa ROW_NUMBER() połączenia, tak:

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)

Wyjście:

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. Problem z tabelą tymczasową RODBC podczas łączenia się z MS SQL Server

  2. Przekazywanie pustej listy do parametru typu tabeli zdefiniowanego przez użytkownika w funkcji skalarnej

  3. Jak wyodrębnić dane z pliku PDF?

  4. Kiedy/dlaczego używać kaskadowania w SQL Server?

  5. Dowiedz się, czy obiekt jest funkcją wartościującą tabelę w SQL Server za pomocą OBJECTPROPERTY()