SQL Server LAG()函数计算行之间的差异

时间:2018-09-07 10:00:33

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

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

需要明确的是,我有这种表: original table


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

calculate differences between rows

最后,预期结果是这个:

what i want

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

$posts = new LengthAwarePaginator(Post::all(), 100, 10);
return $posts->toArray();

当然不行。我认为我还必须进行一次while循环,因为每个用户的行号都会更改。

希望您能帮到我!非常感谢

2 个答案:

答案 0 :(得分:2)

您快到了。只需添加partition by userid,即可计算出每个用户ID和order by dateid的差。

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

答案 1 :(得分:0)

您根本不需要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;