我建立一个查询时遇到麻烦,根据每个月的不同时间,我的项目将按月份分组.我正在使用Postgresql.
例如,我有一个数据表,如下所示:
- Name Period(text)
- Ana 2010/09
- Ana 2010/10
- Ana 2010/11
- Ana 2010/12
- Ana 2011/01
- Ana 2011/02
- Peter 2009/05
- Peter 2009/06
- Peter 2009/07
- Peter 2009/08
- Peter 2009/12
- Peter 2010/01
- Peter 2010/02
- Peter 2010/03
- John 2009/05
- John 2009/06
- John 2009/09
- John 2009/11
- John 2009/12
我希望结果查询是这样的:
- Name Start End
- Ana 2010/09 2011/02
- Peter 2009/05 2009/08
- Peter 2009/12 2010/03
- John 2009/05 2009/06
- John 2009/09 2009/09
- John 2009/11 2009/12
有没有办法实现这一点?
解决方法
这是一个聚合问题,但有一个扭曲 – 您需要为每个名称定义相邻月份的组.
假设这个月份对于一个给定的名字永远不会出现多次,你可以通过在每个期间分配一个“月”号,并减去一个序号.这些值将是连续数月的常数.
- select name,min(period),max(period)
- from (select t.*,(cast(left(period,4) as int) * 12 + cast(right(period,2) as int) -
- row_number() over (partition by name order by period)
- ) as grp
- from names t
- ) t
- group by grp,name;
注意:重复也不是一个问题.你会jsut使用dense_rank()而不是row_number().