0

これまでのところ、次のクエリがあります。これは、内部スコアに基づいて本をランク付けするのに完全に機能します。

UPDATE CER
SET CER.book_rank = Ranker.ranc
FROM book_ranks CER
INNER JOIN
(SELECT Rank() over (Order by book_score desc, book_id) as ranc, book_id
FROM book_ranks
WHERE Category = 'Fiction'
GROUP BY book_id, book_score 
) Ranker
ON
CER.book_id = Ranker.book_id

コードは完璧に機能していますが、大文字と小文字を区別していません。

入力:

bookName  book_score
--------  ----------
book2     45
book3     35
book5     35
book7     35
book9     30

現在の出力:

bookName  book_score  book_rank
--------  ----------  ---------
book2     45          1
book3     35          2
book5     35          3
book7     35          4
book9     30          5

必要な出力:

bookName  book_score  book_rank
--------  ----------  ---------
book2     45          1
book3     35          2
book5     35          2
book7     35          2
book9     30          5

book3、book5、book7 は同じスコアであるため、それらのランクは同じで、book9 はランク 5 である必要があります。

4

2 に答える 2

1

試す:

SELECT * FROM book_ranks CER
INNER JOIN
(SELECT Rank() over (Order by book_score desc  ) 
  -- only difference is here ----------------^^
  as ranc, book_id
  FROM book_ranks
  WHERE Category = 'Fiction'
GROUP BY book_id, book_score 
) Ranker
ON CER.book_id = Ranker.book_id;
于 2012-06-21T23:23:10.747 に答える
0

それ以外の

SELECT Rank() over (Order by book_score desc, book_id)

使用する必要があります

SELECT Rank() over (Order by book_score desc)

それはあなたの問題を解決するでしょう。

于 2012-06-21T23:25:38.663 に答える