当前位置: 首页 > 面试题库 >

Postgres:定义每个开发人员的最长连胜时间(以天为单位)

陆野
2023-03-14
问题内容

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

 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; 最长连胜= 2012年1月2日至2012年3月2日= 2天,等等
。你们中的一些人可以在这件事上为我提供帮助吗?谢谢,


问题答案:

这样做有一个窍门。如果您从日期中减去一个递增的数字序列,那么对于连续的日期,它们将是恒定的。然后,我们可以使用它为每个开发人员定义组。

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)



 类似资料:
  • 问题内容: 上面是我的查询,我想获取一个人每天的记录。该记录应具有当天的最小日期时间。我需要该日期时间的完整记录 我的预期输出在这里 我尝试使用 但是对于“ t1”,我得到id = 1和第一行的输入日期。 请帮帮我。如果重复,则提供链接。 问题答案: 演示

  • 我在一个XML文件中有格式为(Year.Month.Day)的时间戳。 我需要找出以天为单位的两个时间戳之间的区别。 命名空间“std::chrono”没有成员“year”

  • 当我想计算两个日期之间的天数跨度时,我在Java中对日期管理的理解有误。 假设我们有两个不同的日期: 日期1: 1986-01-24 日期2: 2017-04-20 案例1:我有一段使用日期的代码: 产出1: 案例2:使用日历的代码片段: 产出2: 案例3:在Excel中使用电子表格的示例: 当我使用MS Excel来获取这个跨度时,只是引入给定的日期并简单地进行细分,输出如下: 问题 为什么Ja

  • 问题内容: 当我运行以下查询 我收到一个错误“ ” 问题答案: Concat仅接受两个参数。请参阅:http : //docs.oracle.com/cd/B19306_01/server.102/b14200/functions026.htm 使用串联运算符:

  • SQL:我有一个在StartTime和EndTime列中包含员工工作时间的表。我想计算每个员工每天的工作时间,即使员工在一天开始轮班,第二天结束。

  • 因此,我在使用多个临时表生成查询时遇到了一些问题。 首先,我创建了临时表。 然后我写下我的查询如下。这似乎是一个简单的查询。然而,我得到了错误“ORA-00918:列定义不明确”。我不知道是否可以连接这两个临时表,尤其是它们没有任何关系。我只想查询唯一id在DIDV表中的位置,以及标题和注释列不包含KEW字段的位置。 感谢您对理解这一点的任何帮助。 如果需要任何澄清,请告诉我。