Ale*_*lis 5 sql t-sql sql-server
使用Stack Overflow公共数据转储,我创建了三个简单的表:
从一年前到今天,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
Run Code Online (Sandbox Code Playgroud)
但由于上述因素(特别是长尾),我不确定如何近似观点.我的想法是创建一个函数,使用长尾公式,将根据当前的视图数和周开放计算一个月的视图.
这是我想出来的东西:
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
Run Code Online (Sandbox Code Playgroud)
我应该如何继续创建此SQL查询?
最终目标是一个存储的程序,它输入一个CSV字符串的标签,并吐出过去六个月的标签页面视图.
更新在"收获"风滚草徽章之后,我认为是赏金的时候了!
您需要考虑指数视图衰减曲线,类似于此 - http://en.wikipedia.org/wiki/Exponential_decay
我们需要的是曲线下面积达到所需时间(以天为单位).
如果你做数学计算,你会得到一个结果
Views = V/?[1 - e^(-?t)]
Run Code Online (Sandbox Code Playgroud)
t是(创建日期 - 今天的日期 - 1)
V是我们的视图数
λ可以是2ln2/T或1.4/T.
T可以是5天或7天的主要生命时间.让我们把它拿走5.
我们在这里做了很多假设,因为SO的动态性质.但我很肯定它会带来不错的结果.
您现在要做的就是替换适当的值并获取视图.