我有一张表来存储这样的产品评论:
Id -int
ProductId -int
Timestamp -datetime
Comments -text
是否有一种简单的方法来计算和确定产品在任何60分钟的时间内收到的评价率?即。 Widget1最大评论/小时为55。
使用sql05。
答案 0 :(得分:1)
另一种选择是使用SQL DATEPART函数,如下所示:
SELECT
DAY(TimeStamp), MONTH(TimeStamp), YEAR(TimeStamp),
DATEPART(HOUR, TimeStamp),
COUNT(*)
FROM
dbo.Products
GROUP BY
DAY(TimeStamp), MONTH(TimeStamp), YEAR(TimeStamp),
DATEPART(HOUR, TimeStamp)
ORDER BY
COUNT(*) DESC
这不仅为您提供了任何给定小时的最大视图数,而且还提供了按频率排序的所有视图。请注意:除了RexM的解决方案之外,这是基于你的“时间戳”的“小时”部分 - 所以如果你在7:59有很多观点而另一个在8:01爆发,在我的解决方案中,那些不会' t一起显示(因为一个是小时= 7而另一个是小时= 8)。
如果您需要“任何60分钟的时间跨度”方法,请使用RexM的基本构思(DATEDIFF,分钟< = 60)。
马克
答案 1 :(得分:1)
我不知道计算该指标的简单方法,但希望这会有所帮助。如果没有某种SQL游标,我会生成一个可能间隔的SQL表,包括开始和结束时间戳(2009-09-02T00:00到2009-09-02T00:59,2009-09-02T00:01到2009-09 -02T01:00等)然后使用LINQ to SQL交叉连接:
var rates = from r in db.Reviews
from i in db.Intervals
where i.Begin <= r.Timestamp && r.Timestamp <= i.End
group r by i.Begin into reviews
select reviews.Count();
var maxRate = rates.Max();
我没有尝试过代码,但它应该让你开始。您可以通过限制返回检查的时间(最近7天,30天等)或生成更少的间隔(可能从季度小时开始)来提高性能。
答案 2 :(得分:1)
如果您反而希望“哪个产品在dateX和dateY 之间的60分钟内获得最多评论”,那么它会变得更加复杂。
考虑它的一种方法是“对于那段时间内的每次审核,在接下来的60分钟内,对于相同的产品ID,还有多少其他评论”。一旦你有了这个逻辑,查询就会变得更加清晰:
SELECT TOP 1
PR.ProductID,
-- start of 60 minute block
PR.Timestamp,
ReviewCount = (
SELECT COUNT(*)
FROM ProductReviews PR1
-- from parent time
WHERE PR1.Timestamp >= PR.Timestamp
-- until 60 mins later
AND PR1.Timestamp <= DATEADD( minute, 60, PR.Timestamp )
-- that matches ProductID
AND PR1.ProductID = PR.ProductID
)
FROM ProductReviews PR
-- in the last 24 hours
WHERE PR.Timestamp > ( GETDATE() - 1 )
ORDER BY ReviewCount DESC
怎么样?
答案 3 :(得分:0)
如果您正在使用设定的60分钟时间段(例如,从现在开始的最后60分钟),则相当容易:
SELECT TOP 1
PR.ProductID,
COUNT(*)
FROM ProductReviews PR
WHERE PR.Timestamp BETWEEN DATEADD( minute, -60, GETDATE() ) AND GETDATE()
GROUP BY PR.ProductID
ORDER BY COUNT(*) DESC
如果你想要任何60分钟的间隔,那么它会变得更复杂!
答案 4 :(得分:0)
如果您对Windows的固定时间感到满意,我可以考虑通过使用触发器来实现这一点。触发器将插入/更新到“日志”表中,并根据当前时间区分插入或更新。
你可以结合其他任何方法,它会添加一个很好的缓存层。