如何计算使用SQL在stackexchange上发布评论所需的平均时间?

如何计算使用SQL在stackexchange上发布评论所需的平均时间?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在寻找一个计算平均评论时间(每个月测量)的SQL查询 我能够编写一个查询来测量原始post datetime和comment datetime之间的平均时间,但这仍然是不正确的,因为应该测量当前评论和前一个评论之间的时间,因为它们大部分时间都是相关的 select dateadd(month, datediff(month, 0, Comments.creationdate),0) [Date], AVG(CAST(DATEDIFF(hour, Posts.CreationDat

我正在寻找一个计算平均评论时间(每个月测量)的SQL查询

我能够编写一个查询来测量原始post datetime和comment datetime之间的平均时间,但这仍然是不正确的,因为应该测量当前评论和前一个评论之间的时间,因为它们大部分时间都是相关的


select 
  dateadd(month, datediff(month, 0, Comments.creationdate),0) [Date],
  AVG(CAST(DATEDIFF(hour, Posts.CreationDate, Comments.creationdate ) AS BigInt)) [DelayHours]
  from comments
    INNER JOIN posts ON Comments.PostId = Posts.Id
  GROUP BY
    dateadd(month, datediff(month, 0, Comments.creationdate),0)
  ORDER BY Date

我想这样的办法应该行得通。对不起,我现在不能测试它;如果我打印错了,我道歉

WITH cte1 AS
(
SELECT c.PostId, c.creationdate, 
ROW_NUMBER() OVER (PARTITION BY c.PostId ORDER BY c.creationdate) AS rn
FROM comments c
)
SELECT dateadd(month, datediff(month, 0, a.creationdate),0) [Date],
AVG(diff_hr) AS avg_diff
FROM 
(
  SELECT a1.PostId, a1.creationdate,
  CASE
   WHEN a1.rn = 1 THEN 
    CAST(DATEDIFF(hour,p.creationdate,a1.creationdate) AS BIGINT) 
   ELSE
    CAST(DATEDIFF(hour,a2.creationdate,a1.creationdate) AS BIGINT) 
  END AS diff_hr
  FROM cte1 a1
  INNER JOIN posts p ON (p.Id = a1.PostId)
  LEFT JOIN cte1 a2 ON (a2.PostId = a1.PostId AND a2.rn = a1.rn-1)
)a
GROUP BY dateadd(month, datediff(month, 0, a.creationdate),0)
更新 对于SQLServer2012,
LAG
将简化解决方案。。。我注意到关于这个版本的评论太晚了


更新2修复了打印错误(从子句中缺少
,并且
p.PostId
更改为
p.Id
以匹配表定义)

SQLServer的哪个版本?如果是sqlserver 2012,您可以使用LAG()…我不知道它是什么版本的sqlserver,但我正在从它的
Microsoft SQL server 2012(SP1)-11.0.3000.0(X64)
(您可以在数据浏览器界面中运行
select@@version
)是否要查找原始post datetime和第一条注释datetime之间的平均时间?每个操作之间的平均时间,意思是:第一条注释是注释日期-发布日期,第二条注释是第二条注释的时间减去第一条注释的时间…+1表示
滞后
注释。我今天刚学到一些有用的东西关于上面的查询-我认为您在CTE定义中缺少了一个来自
子句的
。试着在这个界面上运行查询:我就是忍不住用
LAG
:数据集中的负值是因为一些编辑过的帖子在一些评论之后很久就有了一个CreationDate(例如,请看这里的第一条评论:)@w0lf:Yeah,使用
LAG
可以简化查询方式。。。当我意识到你正在使用2012年时,我已经发布了“非滞后”版本,它似乎也在工作。