假设我们的高尔夫球场有一个 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
包含升序的逗号分隔值)我想不出任何有用的东西。也许使用递归公用表表达式是可行的方法?
这是一个差距和岛屿问题,其中一个岛屿是给定球员和回合的一系列低于标准杆的洞分数。
我们可以通过窗口求和来识别孤岛,然后聚合排序。
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
。