如何解决SQL Server 2012-重置滚动计数器
我正在使用sql Server 2012,并且希望获得总计登录失败的尝试。我的桌子有
| Login_Name | Is_Success | Login_Date |
我的查询是
select login_name,sum(case when is_success = 1 THEN 0 ELSE 1 END) over (partition by login_name,issuccess order by login_name,login_date,is_success)
from login_table
查询给了我结果,但我希望在is_success变为1时重置计数
| Login_Name | Is_Success | Unsuccessful Attempts |
| admin | 1 | 0 |
| admin | 0 | 1 |
| admin | 0 | 2 |
| admin | 0 | 3 |
| admin | 0 | 4 |
| admin | 0 | 5 |
| admin | 1 | 0 |
| admin | 0 | 1 |
注意:我正在使用 sql Server 2012
解决方法
这是一个经典的差距和孤岛问题。您可以使用窗口式COUNT
将数据分成几组,然后对这些组使用ROW_NUMBER
:
WITH YourTable AS(
SELECT *
FROM (VALUES('admin',1,CONVERT(datetime2(0),'2020-10-30T20:00:00')),('admin','2020-10-30T20:01:00')),'2020-10-30T20:02:00')),'2020-10-30T20:03:00')),'2020-10-30T20:04:00')),'2020-10-30T20:05:00')),'2020-10-30T20:06:00')),'2020-10-30T20:07:00')))V(Login_Name,Is_Success,Login_Date)),Grps AS(
SELECT Login_Name,Login_Date,COUNT(CASE Is_Success WHEN 1 THEN 1 END) OVER (PARTITION BY Login_Name ORDER BY Login_Date) AS Grp
FROM YourTable)
SELECT Login_NAme,ROW_NUMBER() OVER (PARTITION BY Login_NAme,Grp ORDER BY Login_Date) -1 AS UnSuccessfulAttempts
FROM Grps
ORDER BY Login_Name,Grp,Login_Date;
,
我假设您要的是摘要,而不是详细记录?我会这样处理:
SELECT login_name,( SELECT count(*) FROM login_table
WHERE login_name = lt.login_name
AND login_date > ( SELECT MAX(login_date) FROM login_table WHERE login_name = lt.login_name AND is_success = 1 )
) AS failures
FROM login_table AS lt
ORDER BY 1
工作原理:
内部相关子查询获取用户的最后一次成功登录:
SELECT MAX(login_date) FROM login_table WHERE login_name = lt.login_name AND is_success = 1
外部相关查询:
(SELECT count(*)从login_table 登录名= lt。登录名 AND login_date>-最后一次成功登录- )AS失败
计算上一次成功后发生了多少次失败。 我还没有测试。祝您项目顺利!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。