SQL统计24小时重复登录

通过SQL获得如下图所示结果,计算重复登录的相关信息,登录流水系统自动生成不重复。

img


C

假设T1表的结构如下:

login_idlogin_time用户名
12023-02-16 08:00:00用户1
22023-02-16 09:00:00用户
32023-02-15 23:30:00用户1
42023-02-15 22:00:00用户3
52023-02-15 15:00:00用户4
62023-02-14 18:00:00用户2
72023-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_idlogin_time用户名
12023-02-16 08:00:00用户1
22023-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_countrepeat_login_ids
用户121,3
用户222,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的登录记录表,包含以下字段:

  • user_id: 用户ID
  • login_time: 登录时间
    则可以使用以下SQL查询24小时内重复登录的相关信息:
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(unitbeginend

begin和end可以为DATE或DATETIME类型,并且可允许参数为混合类型。