代码之家  ›  专栏  ›  技术社区  ›  KingKerosin

获取排序表中特定元素的位置

  •  1
  • KingKerosin  · 技术社区  · 7 年前

    我有一个问题,排名球员在我的数据库(至少在某种程度上是好的表现)。

    我只有一张桌子,所有的球员都放在那里。玩家的等级取决于 RankingPoints . 所以(在最简单的情况下)玩家的等级是这个表中的位置 RankingPoints DESC 可能不止一个玩家拥有相同的 . 所以我需要一个平局破发点,这样20万分的球员排名就不会改变了。

    另一方面,我有一些根据球员的性别,年龄和国籍的分级别。

    我怎么能现场看排名,比如我有一个男性球员,来自德国的u18,我想知道他的国家排名。

    目前我有这个U18CountryRank的子查询

    U18CountryRank = Players // the database-table holding all players
        .Where(p => p.Gender == MainPlayer.Gender) // male
        .Where(p => p.Country == MainPlayer.Country) // Germany
        .Where(p => p.Classification == MainPlayer.Classification) // U18
        .Where(p => p.RankingPoints >= MainPlayerRankingPoints) // players better or equal than me
        .Where(p => SqlFunctions.Difference(p.PlayerId.ToString(), MainPlayer.PlayerId.ToString()) >= 0) // order by PlayerId
        .Count(); // take the number
    

    SELECT 
        1 AS [C1], 
        [Project1].[C1] AS [C2]
        FROM ( SELECT 
            (SELECT 
                COUNT(1) AS [A1]
                FROM [dbo].[Players] AS [Extent2]
                WHERE ([Extent2].[RankingPoints] >= [Extent1].[RankingPoints]) AND ([Extent2].[Gender] = [Extent1].[Gender]) AND ([Extent2].[Country] = [Extent1].[Country]) AND ((DIFFERENCE(LOWER( CAST( [Extent2].[PlayerId] AS nvarchar(max))), LOWER( CAST( [Extent1].[PlayerId] AS nvarchar(max))))) >= 0)) AS [C1]
            FROM [dbo].[Players] AS [Extent1]
            WHERE (cast('b8957470-db27-4b3c-aa5d-3035ca2c86e6' as uniqueidentifier) = [Extent1].[PlayerId])
        )  AS [Project1]
    

    这对一个玩家来说很好。但当我需要选择某个国家的所有球员时,我的表现会很糟糕。

    我已经试过用 View 它只选择 PlayerId

    另一种方法是在有序子集上使用行数(但在较大的集上仍然是相同的问题)。

    对于这种问题,什么是“最佳实践”?

    1 回复  |  直到 7 年前
        1
  •  0
  •   NetMage    7 年前

    以下是我将如何处理查找男性,U18,德国在 MainPlayer :

    var RankOrderedPlayers = Players
                                .Where(p => p.Gender == MainPlayer.Gender) // male
                                .Where(p => p.Country == MainPlayer.Country) // Germany
                                .Where(p => p.Classification == MainPlayer.Classification) // U18
                                .OrderByDescending(p => p.RankingPoints)
                                .ThenByDescending(p => p.PlayerId)
                                .AsEnumerable()
                                .Select((p, r) => new { Rank = r+1, p });