我有一个SQL表,其中包含我网站订阅者每日登录的列表。这些行包含用户ID以及每天首次登录的日期和时间,这意味着每个成员每天最多有一条记录。
如果每个成员连续每日登录,有没有办法使用SQL来获取数字的计数,这是最新的登录记录?
我可以通过以相反顺序浏览用户的每条记录来以编程方式(C#)执行此操作,并在缺少一天时停止计数,但我正在寻找一种更优雅的方法来通过SQL函数执行此操作。这有可能吗?
谢谢!
答案 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
这里有一个激励性解释的链接:
主要思想是,如果按照个人ID分组并按日期排序,则日期和当前行之间的差异在每个连续日期系列中是不变的。因此,您按用户和此不变量进行分组(以及此组中的最小日期)。然后,您可以按用户分组并选择第二列的计数,并仅选择最大计数。