Sql server 获取照片在SQL中的排名
我有以下表格:Sql server 获取照片在SQL中的排名,sql-server,Sql Server,我有以下表格: Photos [ PhotoID, CategoryID, ... ] PK [ PhotoID ] Categories [ CategoryID, ... ] PK [ CategoryID ] Votes [ PhotoID, UserID, ... ] PK [ PhotoID, UserID ] 照片属于一类。一个类别可能包含许多照片。用户可以对任何照片进行一次投票。一张照片可以由许多用户投票选出 我想选择一张照片的排名(通过计算它拥有多少选票),包括整体排名和该照片
Photos [ PhotoID, CategoryID, ... ] PK [ PhotoID ]
Categories [ CategoryID, ... ] PK [ CategoryID ]
Votes [ PhotoID, UserID, ... ] PK [ PhotoID, UserID ]
照片属于一类。一个类别可能包含许多照片。用户可以对任何照片进行一次投票。一张照片可以由许多用户投票选出
我想选择一张照片的排名(通过计算它拥有多少选票),包括整体排名和该照片所属类别的排名
从投票中选择*的计数,其中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
看一看类似(也许)的东西
太棒了,谢谢。我不知道SQL Server有一个类似于
RANK()
的函数,它将相等的项目排列为相同的级别(与ROW\u NUMBER()
相反)。
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