使用 Stack Overflow 公共(public)数据转储,我创建了三个简单的表:
- 问题(Question_Id、View_Count、Creation_Date)
- 标签 (Tag_Name)
- 问题标签(Question_Id、Tag_Name)
Questions 表有数十万行,Creation_Date 的范围从一年前到今天。纵观数据,有两个值得注意的趋势:
- 问题数量随时间段增加 - 例如,本月提出的问题比三个月前多
- 问题观看次数有长尾 - 通过查看基于开放周的观看次数,我们可以看到大多数问题的观看次数发生在第一周;第二个和第三个的数量较少;并在接下来的几周内形成一条长而恒定的尾部
如果这两个因素都没有发挥作用,那么估计给定标签(或标签组)一个月内的流量就相当简单了:
SELECT YEAR(Q.Creation_Date)
,MONTH(Q.Creation_Date)
,SUM( Q.View_Count / DATEDIFF(m,Q.Creation_Date,GETDATE()) )
FROM Questions Q
JOIN QuestionTags QT
ON Q.Question_Id = QT.Question_Id
WHERE QT.Tag_Name IN ('c#','.net', ... )
GROUP BY YEAR(Q.Creation_Date), MONTH(Q.Creation_Date)
ORDER BY 1,2
但是由于上述因素(尤其是长尾),我不确定如何近似 View 。我的想法是创建一个函数,使用长尾公式,根据当前的观看次数和开放周数计算一个月的观看次数。
这是我找到尾部的方法:
DECLARE @SDTE DATETIME, @EDTE DATETIME
SELECT @SDTE = '2009-01-11' -- after new years holiday
,@EDTE = CAST( MAX([Creation_Date]) AS INT )
FROM [Questions]
SELECT [DaysOpen_Count]
,AVG( [WView_Count] )
FROM
(
SELECT QT.[Tag_Name],
Q.[View_Count],
[DaysOpen_Count] = DATEDIFF(DAY, Q.[Creation_Date], @EDTE),
[WView_Count] = CAST( Q.[View_Count] / ( DATEDIFF(DAY, Q.[Creation_Date], @EDTE) / 7.0 ) AS INT )
FROM [Questions] Q
INNER JOIN [QuestionTags] QT
ON Q.[Question_Id] = QT.[Question_Id]
WHERE [Tag_Name] IN ('c#','.net',...)
AND [Creation_Date] < @EDTE
) Q
GROUP BY [DaysOpen_Count]
ORDER BY 1,2
我应该如何继续创建此 SQL 查询?
最终目标是一个存储过程,它输入标签的 CSV 字符串并输出这些标签过去六个月的页面浏览量。
更新“赢得”风滚草徽章后,我认为是时候获得赏金了!
最佳答案
您需要考虑指数 View 衰减曲线,类似于 - http://en.wikipedia.org/wiki/Exponential_decay
这里我们需要的是到所需时间(以天为单位)的曲线下面积。
如果你进行数学计算,你就会得出结果
Views = V/λ[1 - e^(-λt)]
t 是(创建日期 - 今天的日期 - 1)
V 是我们的观看次数
λ 可以是 2ln2/T 或 1.4/T
T 可以是人生的主要时间,例如 5 天或 7 天。就拿5吧。
由于 SO 的动态性质,我们在这里做出了很多假设。但我确信它会产生良好的结果。
您现在要做的就是替换适当的值并获取 View 。
关于sql - 使用有限的数据估算每个标签(或标签组)每月的页面浏览量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1407092/