【问题标题】:Implementing RANK OVER SQL Clause in C# LINQ在 C# LINQ 中实现 RANK OVER SQL 子句
【发布时间】:2014-01-24 01:46:37
【问题描述】:

我需要实现下面的 T-SQL 子句 ....

RANK() OVER (PARTITION BY a.CategoryKey ORDER BY (x.Rate * @BASE_RATE ) DESC )as Rank

...在 C# LINQ 中。到目前为止,我想出的是......

var rank = data.GroupBy(d => d.CategoryKey)
               .Select(group => group.OrderByDescending(g => g.Rate * @BAES_RATE) 

认为这会给我按速率 * BASE_RATE 排序的每个等级分区。但我真正需要的是单行的个人排名,这是更大结果中的子查询。所以实际上我正在使用的完整 SQL 查询类似于 ....

SELECT 
    a.Rate,
    a.CategoryKey,
    a.ID,
    .
    .
    .
    RANK() OVER (PARTITION BY a.CategoryKey ORDER BY (x.Rate * @BASE_RATE ) DESC )as Rank
FROM data

【问题讨论】:

    标签: c# sql linq tsql linq-to-objects


    【解决方案1】:

    如果您不需要确切的 Rank 语义(即并列等级)。 您可以将可用的索引用于选择投影

    var rank = data.GroupBy(d => d.CategoryKey)
                   .SelectMany(g => g.OrderByDescending(y => y.Rate * @BAES_RATE)              
                                     .Select((x,i) => new{g.Key, Item=x, Rank=i+1}))
    

    要不然可以看this answer

    【讨论】:

    • 很酷,谢谢,我想出了答案,但这也有效
    • @MassStrike Care 分享您的实施?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2022-12-08
    • 2012-12-07
    • 2012-12-19
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多