【问题标题】:SQL Server LAG() function to calculate differences between rowsSQL Server LAG() 函数计算行之间的差异
【发布时间】:2018-09-07 10:00:33
【问题描述】:

我是 SQL Server 的新手,我对 lag() 函数有一些疑问。 我必须计算两个用户活动之间的平均距离(以天为单位)。然后,我必须对所有用户进行 GROUP BY,计算每个用户的所有行之间的所有日期差异,最后选择该组的平均值。

为了清楚起见,我有这种表:


首先,我必须过滤带有活动的日期(活动!=0)。然后我必须创建这个:

最后,预期的结果是这样的:

我认为这可能是一种“某种”代码:

select userid, avg(diff)
  (SELECT *,DATEDIFF(day, Lag(dateid, 1) OVER(ORDER BY [Userid]), 
   dateid) as diff
   FROM table1
   where activities!=0
   group by userid) t
group by userid

当然不行。我想我还必须做一个 while 循环,因为每个用户的行号都会改变。

我希望你能帮助meeee!非常感谢你

【问题讨论】:

  • 欢迎来到 Stackoverflow。与其将数据发布为图像,这里的许多志愿者更希望您将其提供为text。如果您想真正提供帮助,DDL 和INSERT 语句会更好(How to post T-SQL Question)。图片中的某些数据看起来好像丢失了(例如,第一张图片中第 3 行的活动值在哪里)。我也看不到第一张图像中的数据如何变成第二张图像中的数据。如果您提供 DDL 和 INSERT 语句,这将非常有帮助。

标签: sql sql-server lag datediff date-difference


【解决方案1】:

你快到了。只需添加partition by userid,以便为每个用户ID 和order by dateid 计算差异。

select userid, avg(diff)
  (SELECT t.*
         ,DATEDIFF(day, Lag(dateid, 1) OVER(PARTITION BY [Userid] ORDER BY [dateid]),dateid) as diff
   FROM table1 t
   where wager!=0
  ) t
group by userid

【讨论】:

  • 感谢 Vamsi!目前我看不到它是否有效,但我会告诉你的!
【解决方案2】:

你根本不需要lag()。平均值是最大值减去最小值除以计数减一:

SELECT userid,
       DATEDIFF(day, MIN(dateid), MAX(dateid)) * 1.0 / NULLIF(COUNT(*), 1) as avg_diff
FROM table1
WHERE wager<> 0
GROUP BY userid;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多