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

我建立一个查询时遇到麻烦,根据每个月的不同时间,我的项目将按月份分组.我正在使用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;

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

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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...