- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!