2010-12-23 104 views
0

我有以下表格:獲取照片的排名在SQL

Photos [ PhotoID, CategoryID, ... ] PK [ PhotoID ] 
Categories [ CategoryID, ... ] PK [ CategoryID ] 
Votes [ PhotoID, UserID, ... ] PK [ PhotoID, UserID ] 

一張照片屬於一個類別。一個類別可能包含許多照片。用戶可以在任何照片上投票一次。一張照片可以被許多用戶投票。

我想選擇照片的等級(通過統計它有多少張選票),並且在照片所屬類別的範圍內。

SELECT * FROM Votes WHERE PhotoID = @PhotoID的計數是一張照片的投票數。我希望生成的表具有爲整體等級生成的列,並在類別中進行排名,以便我可以對結果進行排序。

因此,例如,從查詢結果表應該是這樣的:

PhotoID VoteCount  RankOverall  RankInCategory 
1   48    1    7 
3   45    2    5 
19   33    3    1 
2   17    4    3 
7   9    5    5 
... 

...你的想法。我怎樣才能做到這一點?到目前爲止,我有以下查詢來獲取投票數,但我需要生成的行列,以及:

SELECT  PhotoID, UserID, CategoryID, DateUploaded, 
          (SELECT  COUNT(CommentID) AS Expr1 
          FROM   dbo.Comments 
          WHERE  (PhotoID = dbo.Photos.PhotoID)) AS CommentCount, 
          (SELECT  COUNT(PhotoID) AS Expr1 
          FROM   dbo.PhotoVotes 
          WHERE  (PhotoID = dbo.Photos.PhotoID)) AS VoteCount, Comments 
FROM   dbo.Photos 

回答

2

看一看像(RANK (Transact-SQL)也許DENSE_RANK (Transact-SQL)

SELECT p.PhotoID, 
     ISNULL(v.CountVotes,0) CountVotes, 
     RANK() OVER(ORDER BY ISNULL(v.CountVotes,0) DESC) RankInCategory, 
     RANK() OVER(PARTITION BY p.CategoryID ORDER BY ISNULL(v.CountVotes,0) DESC) RankInCategory 
FROM Photos p LEFT JOIN 
     (
      SELECT PhotoID, 
        COUNT(PhotoID) CountVotes 
      FROM Votes v 
      GROUP BY PhotoID 
     ) v ON v.PhotoID = p.PhotoID 
+0

令人驚歎的,謝謝。我不知道SQL Server有一個類似`RANK()`的函數,它對相同的項目進行排序(相對於ROW_NUMBER()`)。 – 2010-12-23 09:19:55