获取最新的连续每日登录次数

时间:2017-03-07 08:52:50

标签: sql-server function sql-server-2012

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

如果每个成员连续每日登录,有没有办法使用SQL来获取数字的计数,这是最新的登录记录?

我可以通过以相反顺序浏览用户的每条记录来以编程方式(C#)执行此操作,并在缺少一天时停止计数,但我正在寻找一种更优雅的方法来通过SQL函数执行此操作。这有可能吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

回答评论 您可以使用滞后函数https://msdn.microsoft.com/en-IN/library/hh231256.aspx

如果您的数据库兼容级别低于110,则无法使用滞后功能

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

假设您的单个用户的日期表是

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  

然后

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(*)

,您也可以在最后一个条纹中获取日期
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 :(得分:0)

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

How do I group on continuous ranges

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

Things SQL needs: SERIES()

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