Postgres:定义每个开发人员的最长条纹(以天为单位)

时间:2014-01-16 00:49:12

标签: sql postgresql

有一个软件项目包含一些数据,如下表所示。在此表中,我们有开发人员,他在系统中进行了一些更改(管理请求)的日期以及这些日期中每个日期之间的差异。

 SeqID  | developer |   MR date     |   dates diff
--------+-----------+---------------+----------------
1       |   Ivy     |   01/02/2012  |   0
2       |   Ivy     |   02/02/2012  |   1
3       |   Ivy     |   03/02/2012  |   1
4       |   Ivy     |   10/02/2012  |   7
5       |   Ivy     |   13/02/2012  |   3   
6       |   Ivy     |   14/02/2012  |   1
1       |   Ken     |   17/02/2012  |   0
2       |   Ken     |   20/02/2012  |   3
3       |   Ken     |   22/02/2012  |   2
4       |   Ken     |   23/02/2012  |   1
5       |   Ken     |   24/02/2012  |   1
6       |   Ken     |   25/02/2012  |   1
7       |   Ken     |   01/03/2012  |   4
8       |   Ken     |   05/03/2012  |   4
1       |   Bob     |   19/02/2012  |   0
2       |   Bob     |   23/02/2012  |   4
3       |   Bob     |   01/03/2012  |   6
4       |   Bob     |   02/03/2012  |   1
5       |   Bob     |   03/03/2012  |   1
6       |   Bob     |   05/03/2012  |   2

我想知道的是最长条纹是什么(连续更改在最多1天内完成差异)。与我们在每个开发人员的github统计数据中非常相似的东西。所以结果表就像:

developer   |   longest streak  
------------+------------------------   
    Ivy     |   2   
    Ken     |   3   
    Bob     |   2   

我尝试的解决方案是计算开发人员使用diff date = 1分组的行数。但这不会返回想要的结果。
根据结果​​表,计数应该像:Dev = Ivy;最长条纹= 01/02/2012至03/02/2012 = 2天等。
有人可以帮我解决这个问题吗?谢谢,

1 个答案:

答案 0 :(得分:8)

这样做有一个技巧。如果从日期中减去不断增加的数字序列,那么对于连续的日期,它们将保持不变。然后我们可以使用它来为每个开发人员定义组。

select developer, max(numdays) as maxseq
from (select developer, grp, min(MRDate) as MR_start, max(MRDate) as MR_end,
             count(distinct MRDate) as numdays
      from (select t.*,
                  (MRDate - dense_rank() over (partition by developer order by date)) as grp
            from t
           ) t
      group by developer, grp
     ) t
group by developer;

如果您知道每个日期最多只有一条记录,那么您可以使用row_number()代替dense_rank()count(*)代替count(distinct MRDate)