db2 计算过去30天内用户的平均登录时间

x4shl7ld  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(185)

对于XYZ分析,我想计算用户在过去30天内的平均登录时间,并将其作为AVG_login time放入表中。
表格_1:

user_id  Login_time
10000001  2021.04.12T12:30:03
10000001  2021.04.11T12:31:04
10000001  2021.04.10T12:30:01
10000001  2021.04.09T12:35:12
10000001  2021.04.08T12:25:30
10000002  2021.04.11T12:30:01
10000002  2021.04.10T12:29:08
10000002  2021.04.09T12:12:12
10000002  2021.04.08T12:34:23
10000002  2021.04.07T12:14:43
10000002  2021.04.06T12:30:19

表格_2

User_id    AVG_time_login
10000001   -
10000002   -

请任何人帮助我如何编写MySql查询,以获得“表_2”中的“AVG_time_login”。

js81xvg6

js81xvg61#

首先,我建议对Login_time列使用正确的日期数据类型。如果我理解正确,请遵循以下示例:

CREATE TABLE table_1(
user_id INT,
login_time varchar(30));

insert into table_1 values
(10000001,'2021.04.12T12:30:03'),
(10000001,'2021.04.11T12:31:04'),
(10000001,'2021.04.10T12:30:01'),
(10000001,'2021.04.09T12:35:12'),
(10000001,'2021.04.08T12:25:30'),
(10000002,'2021.04.11T12:30:01'),
(10000002,'2021.04.10T12:29:08'),
(10000002,'2021.04.09T12:12:12'),
(10000002,'2021.04.08T12:34:23'),
(10000002,'2021.04.07T12:14:43'),
(10000002,'2021.04.06T12:30:19');

CREATE TABLE table_2(
user_id INT,
AVG_time_login varchar(30) );

首先,您可以筛选数据:

SELECT user_id,
           avg(datediff(max_date,min_date)) as AVG_time_login
    FROM (
            SELECTuser_id , 
                   max(str_to_date(login_time,'%Y.%m.%dT%H:%i:%s')) as max_date ,
                   min(str_to_date(login_time,'%Y.%m.%dT%H:%i:%s')) as min_date
            FROM table_1
            GROUP BY user_id 
         ) as t1
   GROUP BY user_id;

然后可以使用INSERT INTO SELECT在表中插入

insert into table_2          ( user_id,
                              AVG_time_login
                              )
SELECT user_id,
       avg(datediff(max_date,min_date)) as AVG_time_login
FROM (
        SELECT  user_id , 
                max(str_to_date(login_time,'%Y.%m.%dT%H:%i:%s')) as max_date ,
                min(str_to_date(login_time,'%Y.%m.%dT%H:%i:%s')) as min_date
        FROM table_1
        GROUP  BY user_id 
     ) as t1
GROUP  BY user_id ;

结果:

user_id     AVG_time_login
10000001  4.000000000
10000002  5.000000000

Demo
编辑注解:

SELECT user_id,SEC_TO_TIME(AVG(TIME_TO_SEC((str_to_date(login_time,'%Y.%m.%dT%H:%i:%s'))))) as AVG_time_login
FROM table_1
WHERE  str_to_date(login_time,'%Y.%m.%dT%H:%i:%s') BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
group by user_id;

Demo

2w2cym1i

2w2cym1i2#

请为Db2尝试以下操作:

INSERT INTO Table_2 (User_id, AVG_time_login)
SELECT 
  user_id
, TIME ('00:00:00') + AVG (MIDNIGHT_SECONDS (Login_time))
FROM Table_1
WHERE Login_time > CURRENT TIMESTAMP - 30 DAYS
GROUP BY user_id

相关问题