sql - 使用有限的数据估算每个标签(或标签组)每月的页面浏览量?

标签 sql sql-server tsql

使用 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/

相关文章:

mysql - H2 是否支持单个列的排序规则定义?

mysql - 如果不满足特定条件,如何获得空集

php - SQL SELECT 语句 - 相同的列名

sql-server - 从 Visual Studio (C#) - 如何在调用 sql server 函数时指示函数的默认值

tsql - 连接具有动态数据集的表

sql-server - 如何在不排序的情况下选择表中的最后 5 行?

c# - 撤消授予用户对数据库的访问权限

c# - sql server 24/7 插入删除选择性能

c# DateTime,修剪而不转换为字符串

sql - 用于匹配 T-SQL 脚本中所有注释的正则表达式