微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server 2012-重置滚动计数器

如何解决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 举报,一经查实,本站将立刻删除。