Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取最近连续每日登录的计数_Sql Server_Function_Sql Server 2012 - Fatal编程技术网

Sql server 获取最近连续每日登录的计数

Sql server 获取最近连续每日登录的计数,sql-server,function,sql-server-2012,Sql Server,Function,Sql Server 2012,我有一个SQL表,其中包含订阅者每天登录我的站点的列表。这些行包含用户id以及每天第一次登录的日期和时间,这意味着每个成员每天最多有一条记录 如果每个成员每天连续登录,即最近一次登录,是否有方法使用SQL来计算登录次数 我可以通过编程(C#)来完成这项工作,方法是按相反的顺序检查用户的每条记录,并在缺少一天时停止计数,但我一直在寻找一种更优雅的方法,通过SQL函数来完成这项工作。这有可能吗 谢谢 从评论中回答 您可以使用滞后函数 如果数据库兼容性级别低于110,则不能使用Lag函数 以下代码必须

我有一个SQL表,其中包含订阅者每天登录我的站点的列表。这些行包含用户id以及每天第一次登录的日期和时间,这意味着每个成员每天最多有一条记录

如果每个成员每天连续登录,即最近一次登录,是否有方法使用SQL来计算登录次数

我可以通过编程(C#)来完成这项工作,方法是按相反的顺序检查用户的每条记录,并在缺少一天时停止计数,但我一直在寻找一种更优雅的方法,通过SQL函数来完成这项工作。这有可能吗

谢谢

从评论中回答 您可以使用滞后函数

如果数据库兼容性级别低于110,则不能使用Lag函数

以下代码必须为您获取最新的登录记录(仅当有当天第一次登录的记录时)

假设单个用户的日期表为

pk_id       dates
----------- -----------
27          2017-04-02 
28          2017-04-03 
29          2017-04-04 
30          2017-04-05 
31          2017-04-06 
44          2017-04-09 
45          2017-04-10 
46          2017-04-11 
47          2017-04-12 
48          2017-04-13  
然后


此解决方案可能与您想要的类似:

这里有一个与激励性解释的链接:


其主要思想是,如果在按单个id分组并按日期排序后,日期和当前行之间的差异在每个连续日期序列中都是不变的。因此,您可以按用户和该不变量(以及该组中的最小日期)进行分组。然后,您可以按用户分组,选择第二列的计数,只选择最大计数。

尝试使用Lag显示示例数据和预期结果。.您使用的SQL Server版本是什么?@Osprey,您应该能够使用Hi@Osprey解决此类问题,检查答案是否有效,它是否返回空白。请注意,我正在通过删除时间组件来“清理”日期值。无论如何,我还是按照@Pream的建议,使用LAG函数获得了上一条记录的值。然后,我可以查找DATEDIFF in days大于1的记录,并确定最新的间隔。那么,这只是一个计算发生后的天数的问题。嗨@Osprey,答案属于同一个Pream:D,我刚才在答案中使用了self-join而不是Lag,通过清理来删除时间组件,你的意思是,你正在将数据类型转换为date或varchar??如果dates列的数据类型为date或datetimeHi@Pream,则查询工作正常。当我发布那条消息时,我半睡着了。哈哈,不管怎样,我所说的“清洁”日期是指将“2017-03-08 08:47:34.670”转换为“2017-03-08 00:00.000”。当时间戳被“清理”时,您的功能可以完美地工作。谢谢除了当前的登录记录外,找到有史以来最棒的登录记录听起来不错。一旦有问题的表填充得更多,就会对其进行测试。谢谢
SELECT ROW_NUMBER() OVER(ORDER BY dates desc) AS Row#,dates into #temp1 FROM 
yourTable where userid = @userid

select top 1 a.Row# As LatestStreak from #temp1 a inner join #temp1 b on a.Row# = b.Row#-1 
where a.dates <> DATEADD(DAY,1,b.dates) order by a.Row# asc
SELECT COUNT(*)
FROM 
(SELECT MAX (a.dates) AS Latest
 FROM #yourtable a
WHERE DATEADD(DAY,-1,dates) 
    NOT IN (SELECT dates FROM #yourtable)) AS B
JOIN #yourtable c 
ON c.dates >= b.Latest