使用有限数据每月对每个标记(或标记组)的页面视图进行近似?

Ale*_*lis 5 sql t-sql sql-server

使用Stack Overflow公共数据转储,我创建了三个简单的表:

  • 问题(Question_Id,View_Count,Creation_Date)
  • 标签(Tag_Name)
  • QuestionTags(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
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字符串的标签,并吐出过去六个月的标签页面视图.

更新在"收获"风滚草徽章之后,我认为是赏金的时候了!

Arp*_*mbi 5

您需要考虑指数视图衰减曲线,类似于此 - 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的动态性质.但我很肯定它会带来不错的结果.

您现在要做的就是替换适当的值并获取视图.