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

查找分区中最大的连续数字组

班言
2023-03-14
问题内容

我有以下数据按player_id和match_date排序。我想找出连续运行次数最多的记录组(从2014-04-03到2014-04-12连续3次运行4次)

 player_id  match_date  runs
    1       2014-04-01    5
    1       2014-04-02    55       
    1       2014-04-03    4       
    1       2014-04-10    4       
    1       2014-04-12    4       
    1       2014-04-14    3       
    1       2014-04-19    4       
    1       2014-04-20    44               
    2       2014-04-01    23
    2       2014-04-02    23       
    2       2014-04-03    23       
    2       2014-04-10    23       
    2       2014-04-12    4       
    2       2014-04-14    3       
    2       2014-04-19    23       
    2       2014-04-20    1

我想出了以下SQL:

select *,row_number() over (partition by ranked.player_id,ranked.runs
order by ranked.match_date) as R from (
select player_id ,match_date,runs from players order by 1,2 desc )
ranked order by ranked.player_id, match_date asc

但这 延续 了之前连续运行的排名(由于玩家1已经出现3次,因此在2014-04-19进行的4次针对Player
1的排名预计为1,但排名为4)。同样,在2014-04-19上,玩家2的23奔跑有望获得等级1,但获得排名5,因为已经有4次出现此玩家23奔跑。

当跑步次数的值从上一行改变时,如何将排名 重置 为1?

模式,数据,SQL和输出可在 SQLFiddle
获得


问题答案:

您可以使用窗口功能执行此操作。

select player_id, runs, count(*) as numruns
from (select p.*,
             (row_number() over (partition by player_id order by match_date) -
              row_number() over (partition by player_id, runs order by match_date)
             ) as grp
      from players p
     ) pg
group by grp, player_id, runs
order by numruns desc
limit 1;

关键的观察结果是“按顺序运行”具有此属性:如果按日期枚举(针对每个玩家)行,并且按日期枚举每个玩家和行的行,那么当运行时差异是恒定的都是一样的,井井有条。这形成了一个组,您可以使用该组进行汇总以标识所需的播放器。

这是SQL Fiddle。



 类似资料:
  • 问题内容: 对于这个例子说,我有两个字段的表,和。 该表具有以下数据 我想回来 我想返回的结果是每个区域递增连续值的最长长度。对于。 我将如何在MS Sql 2005上执行此操作? 问题答案: 一种方法是使用遍历每一行的递归CTE。如果该行符合条件(增加同一区域的订单号),则将链长增加一。如果没有,则启动一个新链: SQL Fiddle的实时示例。 另一种方法是使用查询查找“中断”,即以相同区域的

  • 问题内容: 我想知道如何解决这个问题(这不是学校的东西,我是业余爱好,我正在做欧拉的练习)。我的代码中的问题是:char c = great.charAt(i); 我想知道如何在great.charAt(i)中看到下一个i。我发布了代码,在此先感谢您的帮助。 问题答案: 查看程序的输出,我看到它具有如下所示的块: 这说明,对于五个数字的子序列,您实际上只是将其中一个数字乘以五倍。 您需要确保迭代该

  • 问题内容: 我需要查询方面的帮助。 我有这个简单的表: 看起来像这样: 我想为给定的readVal获得最后的连续行: 在上面的示例中将是: id:3 for readVal = 2 id:8 for readVal = 3 我尝试了以下查询: 只要该系列中没有缺失的ID,它就可以工作。在上面的示例中,编号4缺失,查询将不会返回预期的结果。 谢谢! 问题答案: 返回: 对于还需要最后一行的情况: 返

  • 问题内容: 我在数据库表中有一组相当大的电话号码(大约200万个)。这些数字已插入到块中,因此存在许多连续的数字范围,范围从10个数字到1万个数字。其中一些号码正在使用中,因此标记为不可用,其余号码可用。给定一个特定的数字,我需要一种方法来查找该数字之上和之下的连续数字范围。范围应一直持续到找到不可用的数字或遇到两个范围的边界为止。 例如,给定以下设置: 使用1012作为参数进行搜索应返回1010

  • 本文向大家介绍使用JavaScript中的while循环查找最长的连续数字子数组,包括了使用JavaScript中的while循环查找最长的连续数字子数组的使用技巧和注意事项,需要的朋友参考一下 我们需要编写一个带有while语句的函数,该函数确定正整数数组中最大的连续子数组的长度。 例如- 如果输入数组是- 那么输出应该是- 如果输入数组是- 那么输出应该是- 因此,让我们为该函数编写代码- 示

  • 你是一个电视游戏节目的参与者,这给了你赢得奖金的机会。在游戏中,你会看到一系列框,每个框都包含一个允许你看到的正整数值。你有机会选择任何数量的盒子。您的总奖金是您选择包含的所有盒子的总和。这个游戏只有一个限制:如果你选择了两个连续的盒子,你不允许在总数中添加任何后续的盒子,而你的奖品是截至该点的累计金额。你的目标是最大化你的奖金。 给定一个正整数数组,代表游戏中呈现给你的每个盒子的值,返回你能赢得