用于分组月度周期范围的SQL查询

前端之家收集整理的这篇文章主要介绍了用于分组月度周期范围的SQL查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我建立一个查询时遇到麻烦,根据每个月的不同时间,我的项目将按月份分组.我正在使用Postgresql.

例如,我有一个数据表,如下所示:

  1. Name Period(text)
  2. Ana 2010/09
  3. Ana 2010/10
  4. Ana 2010/11
  5. Ana 2010/12
  6. Ana 2011/01
  7. Ana 2011/02
  8. Peter 2009/05
  9. Peter 2009/06
  10. Peter 2009/07
  11. Peter 2009/08
  12. Peter 2009/12
  13. Peter 2010/01
  14. Peter 2010/02
  15. Peter 2010/03
  16. John 2009/05
  17. John 2009/06
  18. John 2009/09
  19. John 2009/11
  20. John 2009/12

我希望结果查询是这样的:

  1. Name Start End
  2. Ana 2010/09 2011/02
  3. Peter 2009/05 2009/08
  4. Peter 2009/12 2010/03
  5. John 2009/05 2009/06
  6. John 2009/09 2009/09
  7. John 2009/11 2009/12

有没有办法实现这一点?

解决方法

这是一个聚合问题,但有一个扭曲 – 您需要为每个名称定义相邻月份的组.

假设这个月份对于一个给定的名字永远不会出现多次,你可以通过在每个期间分配一个“月”号,并减去一个序号.这些值将是连续数月的常数.

  1. select name,min(period),max(period)
  2. from (select t.*,(cast(left(period,4) as int) * 12 + cast(right(period,2) as int) -
  3. row_number() over (partition by name order by period)
  4. ) as grp
  5. from names t
  6. ) t
  7. group by grp,name;

Here是一个sql小提琴,说明了这一点.

注意:重复也不是一个问题.你会jsut使用dense_rank()而不是row_number().

猜你在找的MsSQL相关文章