用于确定高尔夫应用程序中的T恤顺序的SQL

Ale*_*yer 6 java sql database sqlite

我正在开发一个包含记分卡系统的高尔夫应用程序.我正在为数据库中的每个玩家存储每个分数,我需要提出一个查询来确定T恤顺序.所以,例如,如果球员打了3洞,分数看起来像这样......

Player    1  2  3
--------- -  -  -
Player 1: 3, 4, 3
Player 2: 2, 3, 3
Player 3: 2, 4, 3
Run Code Online (Sandbox Code Playgroud)

...然后订单需要看起来像这样......

1.) Player 2
2.) Player 3
3.) Player 1
Run Code Online (Sandbox Code Playgroud)

...因此,与对手的得分相比,球员将按其得分排序.那有意义吗?这甚至可以用于查询,还是应该编写一个函数来解析代码中的二维数组?在这种情况下我使用Java.

我的表结构如下所示:

  • 玩家(玩家ID和玩家姓名)
  • 轮次(圆形ID,课程ID)
  • 分数(圆形id,玩家ID,洞号和分数)

Gor*_*off 3

我可以看到一个解决方案,它使用 Windows 函数 row_number() 和数据库中的附加列来进行每个级别的排序(或 SQL Server 中的递归 CTE)。然而,SQLite 不支持这一点。

以下是我关于在不进行大量向后查询的情况下实施该解决方案的建议:

(1) 分配第一个发球台的发球台顺序。

(2) 对于每个下一个发球台,查看之前的得分和之前的发球顺序:

(3) 通过按最高分数 DESC 和先前发球顺序 ASC 排序,循环遍历先前的分数来分配新的发球顺序。

因为每轮只有几个玩家,所以在应用程序层执行此操作是合理的。但是,如果您有一个支持窗口函数的数据库,那么您可以更轻松地执行仅数据库解决方案。

我无法抗拒。这里有一些代码将使用一个表来存储订单来执行此操作。您需要每个孔循环一次:

create table ThisOrder (
    ThisOrderId int primary key autoincrement,
    RoundId int,
    Hole int,
    PlayerId int
)
Run Code Online (Sandbox Code Playgroud)

按某种顺序为每个玩家初始化它。

然后,为每个孔在表中插入新行:

insert into ThisOrder(RoundId, HoleId, PlayerId)
    select s.RoundId, s.Hole+1, s.PlayerId
    from Scores s join
         ThisOrder to
         on s.PlayerId = to.PlayerId and
            s.RoundId = to.RoundId and
            s.Hole = to.Hole
    order by s.Score DESC, to.Order ASC
Run Code Online (Sandbox Code Playgroud)

您需要为每个洞调用一次此方法,减一。

然后获取您的订单:

 select *
 from ThisOrder
 where roundid = <roundid> and hole = <thehole>
 order by ThisOrderId 
Run Code Online (Sandbox Code Playgroud)