SQL连续登录判断算法一

#原创文章,转载请注明出处

之前有讨论用SQL实现连续登录的判断思路,光说不练假老练,这就上手撸一遍

1.创建表,要关注的字段是用户id和登录时间.创建试验数据:

--Oracle
CREATE TABLE "TIM"."LOGIN_INFO" 
   (	"USERID" VARCHAR2(5), 
	"LOGIN_DATE" DATE
   )
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('01-03-2024 07:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('01-03-2024 15:41:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('03-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('05-03-2024 12:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('06-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('07-03-2024 09:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('09-03-2024 10:30:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('11-03-2024 09:53:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('12-03-2024 11:45:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('13-03-2024 15:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('14-03-2024 14:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('15-03-2024 16:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('16-03-2024 09:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('17-03-2024 10:08:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('19-03-2024 19:05:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('21-03-2024 06:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('22-03-2024 21:47:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('25-03-2024 08:40:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('25-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('26-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('27-03-2024 12:30:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('28-03-2024 08:20:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('29-03-2024 09:00:00', 'dd-mm-yyyy hh24:mi:ss'));
commit;

2.分组去重并排序

select distinct USERID,trunc(LOGIN_DATE) from login_info  order by userid,trunc(LOGIN_DATE)

3.与另外一个连续序列作差

select userid,td,td-rownum from (select distinct USERID,trunc(LOGIN_DATE) td from login_info order by userid,trunc(LOGIN_DATE))

4.分组统计

select userid,count(td-rownum) from (select distinct USERID,trunc(LOGIN_DATE) td from login_info order by userid,trunc(LOGIN_DATE)) group by userid,td-rownum

5.过滤分组统计的数据

select userid,count(td-rownum) from (select distinct USERID,trunc(LOGIN_DATE) td from login_info order by trunc(LOGIN_DATE)) group by userid,td-rownum having count(td-rownum)>=5 /*如果没有符合连续登录5天的数据,userid为空*/

当尝试连接到 SQL Server 时,遇到错误代码 18456 通常意味着身份验证失败。SQL Server 使用这个错误代码来标识登录尝试未被接受,可能是因为以下几个原因: 1. **用户名或密码错误**:提供的登录凭据(通常是 Windows 帐户或 SQL Server 用户名和密码)不正确。 2. **帐户锁定**:如果登录尝试连续失败达到服务器的锁定阈值,可能会暂时锁定该用户帐户。 3. **权限问题**:用户试图访问的数据库或特定资源他们没有相应的权限。 4. **服务器配置**:SQL Server 配置可能阻止了特定 IP 地址或客户端的连接请求。 5. **登录策略**:例如强制使用加密连接(`Kerberos` 或 `SSL/TLS`)而客户端没有支持。 6. **网络问题**:如果服务器和客户端之间的网络连接有问题,也可能导致此错误。 为了解决这个问题,你可以按照以下步骤进行排查: - **检查登录信息**:确保输入的用户名、密码和服务器名称都是正确的。 - **解锁帐户**:如果账户被锁定,联系数据库管理员解除锁定。 - **查看日志**:查看 SQL Server 错误日志(通常是 `%SQLInstance%\log\error.log`)获取更详细的错误信息。 - **检查权限**:确认用户是否有足够的权限访问目标数据库。 - **更新配置**:如果网络或安全设置引起问题,可能需要调整服务器的连接设置。 - **重试连接**:有时重启 SQL Server 服务或者客户端程序可能解决问题。 如果你能提供更多关于具体环境和情况的信息,我可以给出更具体的建议。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值