我有一个SQL表,其中包含站点订阅者的每日登录列表。行包含用户id以及每天第一次登录的日期和时间,这意味着每个成员每天最多有一条记录。
如果每个成员每天连续登录,那么是否有一种方法可以使用SQL获取一个计数,即最新的登录记录?
我可以以编程的方式(C#)为用户按反向顺序遍历每条记录,并在缺少一天的时候停止计数,但我正在寻找一种更优雅的方法,通过一个SQL函数来实现这一点。这有可能吗?
谢谢!
发布于 2017-03-07 09:42:16
从注释中回答,您可以使用滞后函数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发布于 2017-03-07 10:19:00
此解决方案可能与您想要的类似:
它与以下激励性的解释有联系:
主要思想是,如果在您按单个id按日期分组并按日期排序之后,则日期与当前行之间的差异在每个连续日期序列中都是不变的。因此,您将按用户和此不变值(以及该组中的最小日期)进行分组。然后您可以按用户分组,选择第二列的计数,然后只选择最大计数。
https://stackoverflow.com/questions/42643876
复制相似问题