首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取特定元素在有序表中的位置

获取特定元素在有序表中的位置
EN

Stack Overflow用户
提问于 2018-09-19 19:46:19
回答 1查看 62关注 0票数 1

我在对我的数据库中的球员进行排名时遇到了问题(至少在表现良好的情况下是这样)。

我有一个单独的表,所有的球员都存放在这里。玩家的排名取决于RankingPoints的数量。所以(在最简单的情况下)球员的排名是这个表中由RankingPoints DESC排序的位置。可能有多个玩家具有相同的RankingPoints。因此,我需要一个打破平局的机会,这样得分200.000分的球员的排名就不会改变。

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

我如何实时阅读排名,例如,我有一个男球员,来自德国的u18,我想知道他的国家排名。

目前,我有这个针对U18CountryRank的子查询

代码语言:javascript
复制
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

这是生成的sql:

代码语言:javascript
复制
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]

这对单个玩家来说很好。但是当我需要选择某个国家的所有球员时,表现就会像地狱一样。

我已经尝试使用只选择PlayerId和不同等级的View。尽管如此,在较大的设备上性能仍然很差。

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

针对这类问题的“最佳实践”是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-09-20 04:12:55

下面是我如何在MainPlayer中查找德国male,U18的子排名

代码语言:javascript
复制
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 });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52405139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档