T-SQL 查询以查找高尔夫数据库中低于标准杆分数的最连续数

问题描述 投票:0回答:1

假设我们的高尔夫球场有一个 MsSQL 数据库。我们有一个名为

Results
的表,其中包含以下列(所有
INT
NOT NULL
):

  • PlayerId
  • RoundId
  • HoleId
  • Score

我们还有一个名为

Holes
的表,其中包含以下列(所有
INT
NOT NULL
):

  • HoleId
  • Number
    (1 至 18)
  • Par
    (3、4或5)

我们想写一个查询,找出谁在单轮比赛中连续低于标准杆数(一杆进洞、小鸟球、老鹰、双鹰)。查询应返回以下信息:

  • PlayerId
  • RoundId
  • NumberOfConsecutiveUnderParScores
    (一个
    INT
  • UnderParHoleNumbers
    (一个
    VARCHAR
    包含升序的逗号分隔值)

我想不出任何有用的东西。也许使用递归公用表表达式是可行的方法?

sql sql-server aggregate-functions gaps-and-islands
1个回答
0
投票

这是一个差距和岛屿问题,其中一个岛屿是给定球员和回合的一系列低于标准杆的洞分数。

我们可以通过窗口求和来识别孤岛,然后聚合排序。

select playerId, roundId,
    count(*) NumberOfConsecutiveUnderParHoles,
    string_agg(number, ', ') within group (order by number) UnderParHoleNumbers
from (
    select r.*, h.number,
        sum(case when r.score < h.par then 0 else 1 end) over(partition by r.playerId, r.roundId order by h.number) grp
    from results r
    inner join holes h on h.holeId = r.holeId
) t
group by playerId, roundId, grp
order by count(*) desc

如果你只是想要最长的低于标准杆的记录,你可以将选择转到

select top (1) with ties

© www.soinside.com 2019 - 2024. All rights reserved.