首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取最近连续的每日登录次数。

问获取最近连续的每日登录次数。
EN

Stack Overflow用户
提问于 2017-03-07 08:52:50
回答 2查看 1.1K关注 0票数 1

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

如果每个成员每天连续登录,那么是否有一种方法可以使用SQL获取一个计数,即最新的登录记录?

我可以以编程的方式(C#)为用户按反向顺序遍历每条记录,并在缺少一天的时候停止计数,但我正在寻找一种更优雅的方法,通过一个SQL函数来实现这一点。这有可能吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-07 09:42:16

从注释中回答,您可以使用滞后函数https://msdn.microsoft.com/en-IN/library/hh231256.aspx

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

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

假设单个用户的日期表是

代码语言:javascript
复制
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  

然后

代码语言:javascript
复制
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

这给了您5,我使用了内连接,这样它就不会出现服务器兼容性问题

或者您也可以使用这个,如果使用c.dates而不是count(*),也可以在最后一行中得到日期。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-03-07 10:19:00

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

如何在连续范围内分组?

它与以下激励性的解释有联系:

SQL需要的东西: SERIES()

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42643876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档