我是SQL Server的新手,并且对lag()函数有一些疑问。 我必须计算两个用户活动之间的平均距离(以天为单位)。然后,我必须对所有用户进行GROUP BY,为每个用户计算行之间的所有日期差,最后选择组的平均值。
需要明确的是,我有这种表:
首先,我必须使用活动(活动!= 0)来过滤日期。然后我必须创建这个:
最后,预期结果是这个:
我认为这可能是“一种”代码:
$posts = new LengthAwarePaginator(Post::all(), 100, 10);
return $posts->toArray();
当然不行。我认为我还必须进行一次while循环,因为每个用户的行号都会更改。
希望您能帮到我!非常感谢
答案 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;