查找每小时创建的最大行数?

时间:2009-09-02 05:05:00

标签: c# linq sql-server-2005 linq-to-sql

我有一张表来存储这样的产品评论:

Id -int
ProductId -int
Timestamp -datetime
Comments -text

是否有一种简单的方法来计算和确定产品在任何60分钟的时间内收到的评价率?即。 Widget1最大评论/小时为55。

使用sql05。

5 个答案:

答案 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的固定时间感到满意,我可以考虑通过使用触发器来实现这一点。触发器将插入/更新到“日志”表中,并根据当前时间区分插入或更新。

你可以结合其他任何方法,它会添加一个很好的缓存层。