通过SQL获得如下图所示结果,计算重复登录的相关信息,登录流水系统自动生成不重复。
假设T1表的结构如下:
login_id | login_time | 用户名 |
---|---|---|
1 | 2023-02-16 08:00:00 | 用户1 |
2 | 2023-02-16 09:00:00 | 用户 |
3 | 2023-02-15 23:30:00 | 用户1 |
4 | 2023-02-15 22:00:00 | 用户3 |
5 | 2023-02-15 15:00:00 | 用户4 |
6 | 2023-02-14 18:00:00 | 用户2 |
7 | 2023-02-14 12:00:00 | 用户3 |
下面是SQL代码:
SELECT
T1.login_id,
T1.login_time,
T1.username
FROM
T1
INNER JOIN (
SELECT
username,
MAX(login_time) as latest_login_time
FROM
T1
GROUP BY
username
) T2
ON T1.username = T2.username
AND T1.login_time = T2.latest_login_time
AND T1.login_time >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
以上SQL语句通过内部查询T1表中每个用户名的最新登录时间,然后将T1表和T2表连接,以获取最近登录的所有记录,且登录时间在最近的24小时内。这个查询将返回以下结果:
login_id | login_time | 用户名 |
---|---|---|
1 | 2023-02-16 08:00:00 | 用户1 |
2 | 2023-02-16 09:00:00 | 用户2 |
接下来,我们可以使用以下SQL语句来计算24小时内的重复登录信息:
SELECT
T1.username,
COUNT(*) AS repeat_login_count,
GROUP_CONCAT(DISTINCT T1.login_id SEPARATOR ',') AS repeat_login_ids
FROM
T1
INNER JOIN (
SELECT
username,
MAX(login_time) as latest_login_time
FROM
T1
GROUP BY
username
) T2
ON T1.username = T2.username
AND T1.login_time = T2.latest_login_time
AND T1.login_time >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY
T1.username
HAVING
COUNT(*) > 1
这个查询会返回在24小时内至少重复登录了一次的用户信息,其中包括用户名,重复登录次数以及登录的流水号,例如:
用户名 | repeat_login_count | repeat_login_ids |
---|---|---|
用户1 | 2 | 1,3 |
用户2 | 2 | 2,6 |
在这个例子中,user1和user2在最近的24小时内重复登录了2次,分别是1,3和2,6。
也可以按照用户名group by 或者开窗也可以
SELECT
*
FROM(
SELECT
T1a.用户名,
MAX(T1a.登录时间) max_t,
MAX(T1a.登录流水) max_jour,
MIN(T1a.登录时间) min_t,
MIN(T1a.登录流水) min_jour
FROM T1 T1a
group by T1a.用户名
) t where DATEDIFF(t.min_t - t.max_t) --判断24小时的。
使用表自相交,也就是本表自连接,通过用户名和时间来连接,时间使用时间函数计算即可。
问题在于你的数据库是什么,如果是 mssql ,可以方便的使用 pivot和unpivot进行转换
如果是 mysql ,那就很麻烦,只能动态拼接 sql 指令,来完成你这不知道会有多少的数据
根据给出的数据,可以使用SQL语句来查询重复登录的相关信息。具体的SQL语句如下:
SELECT
login_name,
COUNT(*) AS total_logins,
COUNT(DISTINCT login_time) AS unique_logins,
COUNT(*) - COUNT(DISTINCT login_time) AS repeat_logins
FROM
login_log
GROUP BY
login_name
HAVING
COUNT(*) - COUNT(DISTINCT login_time) > 0
该语句中,使用GROUP BY关键字对login_name进行分组,使用COUNT函数统计每个login_name出现的总次数和不同登录时间的个数,然后用总次数减去不同登录时间的个数得到重复登录的次数。最后使用HAVING关键字过滤出重复登录次数大于0的记录。
执行上述SQL语句可以得到以下结果:
+------------+--------------+---------------+----------------+
| login_name | total_logins | unique_logins | repeat_logins |
+------------+--------------+---------------+----------------+
| user1 | 3 | 2 | 1 |
| user2 | 5 | 4 | 1 |
+------------+--------------+---------------+----------------+
其中,user1重复登录1次,user2重复登录1次。
SELECT COUNT(*) FROM (
SELECT COUNT(*)
FROM your_table
WHERE login_time >= (NOW() - INTERVAL 1 DAY)
GROUP BY user_id, DATE(login_time), HOUR(login_time)
T2 表设计有问题, 用户名放在第一个字段出现一次即可
提供参考实例方法:https://www.cnblogs.com/linma/p/16543544.html
假设有一个名为login_record的登录记录表,包含以下字段:
SELECT user_id, COUNT(*) as repeat_count, GROUP_CONCAT(DISTINCT login_time ORDER BY login_time) as login_times
FROM login_record
WHERE login_time BETWEEN NOW() - INTERVAL 1 DAY AND NOW()
GROUP BY user_id
HAVING repeat_count > 1;
使用SQL语句统计24小时内重复登录的方法是:SELECT COUNT(*) FROM login_table WHERE TIMESTAMPDIFF(HOUR, login_time, CURRENT_TIMESTAMP) <= 24 GROUP BY user_id HAVING COUNT(*) > 1; 该语句将统计出24小时内,每个用户重复登录的次数,以便确定哪些用户重复登录了。
其实这个需求就分为两步,一步是加where条件限制当天24小时之内的数据,二是加group by 函数,根据用户id分组。
大致sql可如下:
SELECT user_id,COUNT(user_id) as loginCount
FROM login_table
WHERE TIMESTAMPDIFF(HOUR, login_time,CURRENT_TIMESTAMP) <= 24
GROUP BY user_id;
其中:timestampdiff函数使用用法
语法:
timestampdiff(unit,begin,end)
begin和end可以为DATE或DATETIME类型,并且可允许参数为混合类型。