【问题标题】:How to select top rated photos in the last few days?如何选择最近几天评分最高的照片?
【发布时间】:2012-01-21 22:36:50
【问题描述】:

这是我的数据上下文:

Photos (ID, Title)
Users (ID, FullName)
Ratings (PhotoID, UserID, Value, Date)

业务规则:

  • 用户可以从 1 到 5 对照片进行评分
  • 给定用户只能对给定照片评分一次

我想选择最近(比如说 3 天)内评分最高的照片。那么今天、昨天和前天哪张照片的评分最高呢?如果可能的话,我想让天数可变。我必须显示最后 N 天,只有他们评分不包括空天。

我想在单个查询/结果中获取照片,因为我想将其绑定到 ListView 以在 Web 表单上显示它们。

我是这样开始的:

DECLARE @days INT = 3

SELECT TOP (@days) ... FROM Ratings
INNER JOIN Photos ON Photos.ID = Ratings.PhotoID
GROUP BY DATEDIFF(day, [Date], CURRENT_TIMESTAMP)
ORDER BY DATEDIFF(day, [Date], CURRENT_TIMESTAMP) DESC

如何按 PhotoID 对我的组进行分组,按 SUM(Value) 排序并从每个组中选择第一个?非常感谢您的帮助。

【问题讨论】:

  • 我已经编辑了我的问题,你可以看到我的几行代码。我认为我的问题很常见,所以我昨天开始寻找解决方案。但我没有运气,我无法构建一个格式良好的搜索查询来找到解决方案。

标签: asp.net sql sql-server sql-server-2008 tsql


【解决方案1】:
SELECT Date, TotalRating, Photos.*
FROM Photos
INNER JOIN 
(SELECT ROW_NUMBER() OVER (ORDER BY Date DESC) AS RowNumber, 
        PhotoID, Date, TotalRating
 FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Date, ORDER BY TotalRating DESC) AS inRowNumber,
              PhotoID, Date, TotalRating
        FROM (SELECT PhotoID, Date, SUM(Value) AS TotalRating
              FROM Photos
              GROUP BY PhotoID, Date
              HAVING SUM(Value) > 0 ) t)
 WHERE inRowNumber = 1) t ON Photos.Id = t.PhotoID
 WHERE RowNumber <= @days

【讨论】:

  • 您需要将内部选择限制为最近 3 天。
  • @ypercube 顺便说一句,它是“每 kyoob 的眼睛”还是“为什么每 kyoob”?词源是什么? (也许在您的个人资料上注明?)
  • @Bohemian:我猜是第一个。词源来自超立方体(从某些机器将(目录)名称限制为 8 个字符的时代:)
  • 我的猜测是,OP 想要按每张照片的平均评分而不是评分总和来排序。可能对具有许多评分的照片进行一些额外的加权,即它们都以 1 到 5 的等级出现,但平均评分为 4.5 超过 100 的照片可能会超过评分为 2 的 4.5。
  • 首先感谢您的评论。我试过你的查询,但它只产生一行。我想在一个结果中获得一天中最好的照片。
猜你喜欢
  • 2013-01-21
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
相关资源
最近更新 更多