복붙노트

[SQL] C #을 LINQ에서 구현 RANK OVER SQL 조항

SQL

C #을 LINQ에서 구현 RANK OVER SQL 조항

나는 다음과 같은 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

해결법

  1. ==============================

    1.당신은 정확한 순위의 의미 (즉, 공동 순위)이 필요하지 않은 경우. 당신은 선택 돌기 사용할 수있는 인덱스를 사용할 수 있습니다

    당신은 정확한 순위의 의미 (즉, 공동 순위)이 필요하지 않은 경우. 당신은 선택 돌기 사용할 수있는 인덱스를 사용할 수 있습니다

    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}))
    

    그렇지 않으면 당신은이 답변을 볼 수 있습니다

  2. from https://stackoverflow.com/questions/20953645/implementing-rank-over-sql-clause-in-c-sharp-linq by cc-by-sa and MIT license