2014-01-16 36 views
3

定义最长连胜(天)有与所例举如下表一些数据的软件项目。在这个表中,我们有开发者,日期,他做了系统中的某些变化(管理要求),并在几天这些日期每一个之间的差异。Postgres的:每个开发人员

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 

我尝试的解决方案是我们算多少行有差异日期= 1个分组由开发商。但是这不会返回想要的结果。
作为每所得表中的计数应等来进行:开发=常春藤;最长连线= 01/02/2012至03/02/2012 = 2天等
您可以帮助我解决这个问题吗?谢谢,

回答

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)

+0

非常好的解决方案。 –

相关问题