gpt4 book ai didi

mysql - 如何统计sql中满足特定条件的循环数

转载 作者:行者123 更新时间:2023-11-29 23:00:19 25 4
gpt4 key购买 nike

在MySQL数据库上,我有下表(它是客户的面板数据)

 
user | tab | action | time|

77 - login 1407171344
77 user-info view 1407171400
77 traffic select 1407171407
77 - login 1407171440
65 - login 1407171505
65 change select 1407564830
65 change pay 1407579352
65 - login 1407579442
65 - login 1407579765
77 - login 1407579866
77 - login 1407680000
77 promotion bank 1407171400
77 promotion pay 1408100946
65 traffic select 1407171400
65 traffic pay 1408114734
65 - login 1408125796
65 service extend 1408192741

我有很多行具有不同的客户 ID。我想计算每个客户的事件 session 数。也就是说,我想统计客户登录以及登录后执行另一个操作的次数。因此,两次连续登录且中间没有执行任何操作不会计入一次 session 。下次登录可以代理 session 的结束。对于用户 77,前三行(操作:登录、选择、查看)包含一个 session ,但下次登录则不会,因为没有执行其他操作。因此,在上表中,用户 77 有两个事件 session ,用户 75 有 3 个事件 session 。

事件 session 如下:(重复登录不会删除任何操作)

user | 	tab   |   action    |    time| 

77 - login 1407171344
77 user-info view 1407171400
77 traffic select 1407171407
65 - login 1407171505
65 change select 1407564830
65 change pay 1407579352
65 - login 1407579765
77 - login 1407680000
77 promotion bank 1407171400
77 promotion pay 1408100946
65 traffic select 1407171400
65 traffic pay 1408114734
65 - login 1408125796
65 service extend 1408192741

如何计算活跃 session 数?提前致谢。

附注我尝试过在 R 中导入数据,但这是一个大数据,而且 R 的循环速度似乎很慢。所以我尝试尽可能地坚持使用 SQL。

最佳答案

假设用户不能同时进行多个 session ,如果它们这样做,那么您需要使用第三个参数以不同的方式跟踪它们。假设您的数据目前已在表 user_action 中它看起来像:

SELECT  user,action,time  FROM user_action  order by user, time;
user activity time
65 select 1407171400
65 login 1407171505
65 select 1407564830
65 pay 1407579352
65 login 1407579442
65 login 1407579765
65 pay 1408114734
65 login 1408125796
65 extend 1408192741
77 login 1407171344
77 bank 1407171400
77 view 1407171400
77 select 1407171407
77 login 1407171440
77 login 1407579866
77 login 1407680000
77 pay 1408100946

复制按用户排序的记录,然后按时间排序,使用新的列事件编号 --> 放入新的临时表中进行分析

每个客户的最后一次 session 可能没有登录记录来表示 session 结束,因此我们为每个客户添加一个登录行以结束其 session 。

DROP TABLE IF EXISTS user_action_temp;
SET @activity_number := 0;
CREATE TABLE user_action_temp
AS
SELECT @activity_number := @activity_number + 1 AS activity_number, user, action, time
FROM
(SELECT user,action,time FROM user_action
UNION SELECT user,'login' as action,max(time)+1 as time FROM user_action GROUP BY user) AS USER_ACTIVITY
ORDER BY user, time;

您的数据现在如下所示:

select * From user_action_temp order by user, time;
activity_number user action time
1 65 select 1407171400
2 65 login 1407171505
3 65 select 1407564830
4 65 pay 1407579352
5 65 login 1407579442
6 65 login 1407579765
7 65 pay 1408114734
8 65 login 1408125796
9 65 extend 1408192741
10 65 login 1408192742
11 77 login 1407171344
12 77 bank 1407171400
13 77 view 1407171400
14 77 select 1407171407
15 77 login 1407171440
16 77 login 1407579866
17 77 login 1407680000
18 77 pay 1408100946
19 77 login 1408100947

接下来,自行连接该表让我们定义两个变量来设置每个登录事件的登录号。

SET @login_number1:=0;
SET @login_number2:=0;

自联接表 1 中的登录号与表 2 中的下一个登录号相匹配,并且用户保持不变。事件计数是两次登录之间的总事件

SELECT * FROM
(
SELECT logins_1.user,
logins_1.time as session_start,
logins_2.time as session_end,

case when (logins_2.activity_number -logins_1.activity_number )>1
then (logins_2.activity_number -logins_1.activity_number - 1) else 0 end
as activity_count

FROM
(SELECT @login_number1 := @login_number1 + 1 AS login_number,
activity_number, user, action, time
FROM user_action_temp
WHERE action='login'
ORDER BY user, time) AS logins_1
LEFT OUTER JOIN
(SELECT @login_number2 := @login_number2 + 1 AS login_number2,
activity_number, user, action, time
FROM user_action_temp
WHERE action='login'
ORDER BY user, time) AS logins_2
on logins_1.login_number = (logins_2.login_number2-1)
and logins_1.user = logins_2.user

) AS RESULT;

其中提供了所有用户 session 的摘要:

user    session_start   session_end activity_count
65 1407171505 1407579442 2
65 1407579442 1407579765 0
65 1407579765 1408125796 1
65 1408125796 1408192742 1
65 1408192742 <null> 0
77 1407171344 1407171440 3
77 1407171440 1407579866 0
77 1407579866 1407680000 0
77 1407680000 1408100947 1
77 1408100947 <null> 0

您可以使用 WHERE Activity_count>0 过滤上述查询以获得您想要的内容。

关于mysql - 如何统计sql中满足特定条件的循环数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com