SQL Server:仅选择具有多个列的记录的第一个实例

茨威特

我正在尝试从分数保持系统中获取一些个人统计信息。本质上,球队被安排参加比赛

Match
---------
Matchid (uniqueidentifier)
SessionId (int)
WeekNum (int)

这些比赛分为几组,其中团队中的两名特定球员互相比赛

MatchSet
-----------
SetId (int)
Matchid (uniqueidentifier)
HomePlayer (int)
AwayPlayer (int)
WinningPlayer (int)
LosingPlayer (int)
WinningPoints (int)
LosingPoints (int)
MatchEndTime (datetime)

为了允许球员缺席,每场比赛允许球员玩两次。每组的得分将计入他们的球队总数,但对于个人奖项,仅应计算球员第一次参加比赛。

我一直在尝试利用CTE对行进行编号

;WITH cte AS
(
   SELECT *,
       ROW_NUMBER() OVER (PARTITION BY MatchId ORDER BY MatchEndTime) AS rn
   FROM 
       (SELECT 
            SetId, MS.MatchId, WinningPlayer, LosingPlayer, 
            HomePlayer, AwayPlayer, WinningPoints, LosingPoints, MatchEndTime
        FROM 
            MatchSet MS 
        INNER JOIN 
            [Match] M ON M.MatchId = MS.MatchId AND M.[Session] = @SessionId
    )

但是我很努力,因为玩家可能是给定集合中的主场球员或客场球员(也可能是获胜者或失败者)

理想情况下,然后可以基于WinningPlayer或LosingPlayer将结果加入回到玩家表,这将使我获得个人排名的列表

罗伯·S

我认为第一步是编写一些CTE,这些CTE会将数据放入一个结构中,在此结构中您可以评估玩家得分而不管赢/输。这是一个可能的开始:

;with PlayersPoints as 
(
   select m.MatchId
        ,m.SessionId 
        ,m.WeekNum
        ,ms.SetId       
        ,ms.WinningPlayer as PlayerId
        ,ms.WinningPoints as Points
        ,'W' as Outcome
        ,ms.MatchEndTime 
    from MatchSet ms
    join Match m on on ms.MatchId = m.MatchId
        and m.SessionId = @SessionId 

   union all 

   select m.MatchId
        ,m.SessionId 
        ,m.WeekNum
        ,ms.SetId   
        ,ms.LosingPlayer as PlayerId
        ,ms.LosingPoints as Points
        ,'L' as Outcome
        ,ms.MatchEndTime 
    from MatchSet ms
   join Match m on on ms.MatchId = m.MatchId
        and m.SessionId = @SessionId 
)
, PlayerMatch as 
(
   select SetId
        ,WeekNum
        ,MatchId
        ,PlayerId
        ,row_number() over (partition by PlayerId, WeekNum order by MatchEndTime) as PlayerMatchSequence
    from PlayerPoints 
)
....

第一个CTE提取每个玩家的分数,第二个CTE识别匹配的人。因此,要计算单个点,您需要查找PlayerMatchSequence = 1。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL IN子句仅返回ID以逗号分隔的列表中具有第一个匹配项的行

SQL删除具有相同值的所有连续记录,仅保留第一个和最后一个

在SQL中仅选择一个不同的列来选择多个列

是否可以仅对列值的第一个实例进行sql count()?

SQL:选择第一列的第一个匹配项,第二个值不同

SQL Server查询-保留组的第一个和最后一个唯一记录

SQL Server将XML解析为表-具有相同名称的多个节点,第一个节点应为表列

SQL Server获得第一个匹配值

SQL查询仅具有一个条件的记录

如何在SQL Server存储过程中选择第一个ID的值?

如何从SQL Server中一个记录的多个值中仅获取指定的值记录

sql-当我得到2个或更多具有相同值的值时,仅更新1(第一个查询找到)值的方法?

如何在SQL Server中选择第一个插入的行?

选择多个列,而在SQL Server Compact Edition中只有一个不同的列

在SQL Server中选择具有多个行条件的记录

仅选择在SQL Server中具有一个或多个特定值的值

别名选择器不起作用的SQL IN运算符仅返回第一个匹配项

仅获取第一个结果外部联接SQL Server

在sql的xml列中选择第一个<field>的值

选择具有第一个条件的第三个表 [SQL]

SQL - 在重复记录的第一个实例中只显示一列的结果

按两列分组时获取第一个记录更改时间戳 SQL Server

获取第一个不同(给定)列值的所有值的 SQL 查询

如何获得内部联接的第一个实例以在 SQL Server 中执行“选择进入”?

如何选择第一个值 - SQL Server

如何在Snowflake sql中仅使用值更新第一个NULL列?

如何使用多个近似匹配执行复杂的 SQL 连接并仅返回第一个匹配

在sas proc sql中分组后删除列的第一个实例

SQL Server 中的聚集索引:列在架构中的第一个有什么优势?