sql – 按顺序更改分组列值来分组数据

前端之家收集整理的这篇文章主要介绍了sql – 按顺序更改分组列值来分组数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有以下数据
  1. create table #ph (product int,[date] date,price int)
  2. insert into #ph select 1,'20120101',1
  3. insert into #ph select 1,'20120102','20120103','20120104','20120105',2
  4. insert into #ph select 1,'20120106','20120107','20120108','20120109','20120110','20120111','20120112',1

我想产生以下输出

  1. product | date_from | date_to | price
  2. 1 | 20120101 | 20120105 | 1
  3. 1 | 20120105 | 20120109 | 2
  4. 1 | 20120109 | 20120112 | 1

如果我按价格分组并显示最大和最小日期,那么我将得到以下不是我想要的(参见日期的重叠).

  1. product | date_from | date_to | price
  2. 1 | 20120101 | 20120112 | 1
  3. 1 | 20120105 | 20120108 | 2

因此,基本上我希望做的是根据组列产品和价格对数据进行分组更改.

实现这一目标的最简洁方法是什么?

解决方法

有一种(或多或少)已知的解决此类问题的技术,涉及两个 ROW_NUMBER()调用,如下所示:
  1. WITH marked AS (
  2. SELECT
  3. *,grp = ROW_NUMBER() OVER (PARTITION BY product ORDER BY date)
  4. - ROW_NUMBER() OVER (PARTITION BY product,price ORDER BY date)
  5. FROM #ph
  6. )
  7. SELECT
  8. product,date_from = MIN(date),date_to = MAX(date),price
  9. FROM marked
  10. GROUP BY
  11. product,price,grp
  12. ORDER BY
  13. product,MIN(date)

输出

  1. product date_from date_to price
  2. ------- ---------- ------------- -----
  3. 1 2012-01-01 2012-01-04 1
  4. 1 2012-01-05 2012-01-08 2
  5. 1 2012-01-09 2012-01-12 1

猜你在找的MsSQL相关文章