MySQL - 计算其他值之间出现的值

标签 mysql sql count group-by

我想计算某个值在特定值之前出现的次数

下面是我的起始表

+-----------------+--------------+------------+
| Id              | Activity     |  Time      |
+-----------------+--------------+------------+
| 1               | Click        | 1392263852 |
| 2               | Error        | 1392263853 |
| 3               | Finish       | 1392263862 |
| 4               | Click        | 1392263883 |
| 5               | Click        | 1392263888 |
| 6               | Finish       | 1392263952 |
+-----------------+--------------+------------+

我想计算在完成之前发生了多少次点击。 我有一个非常迂回的方法来做到这一点,我编写一个函数来查找最后一个 完成的事件并查询完成之间的点击次数。 对于错误也重复此操作。

我想要实现的是下表

+-----------------+--------------+------------+--------------+------------+
| Id              | Activity     |  Time      | Clicks       | Error      |
+-----------------+--------------+------------+--------------+------------+
| 3               | Finish       | 1392263862 | 1            | 1          |
| 6               | Finish       | 1392263952 | 2            | 0          |
+-----------------+--------------+------------+--------------+------------+

这张表很长,所以我正在寻找一个有效的解决方案。 如果有人有任何想法。

谢谢!

最佳答案

这是一个复杂的问题。这是解决该问题的方法。 “完成”记录之间的组需要通过为它们分配组标识符来标识为相同。该标识符可以通过计算id较大的“完成”记录的数量来计算。

分配后,可以使用聚合来计算结果。

可以使用相关子查询来计算组标识符:

select max(id) as id, 'Finish' as Activity, max(time) as Time,
       sum(Activity = 'Clicks') as Clicks, sum(activity = 'Error') as Error
from (select s.*,
             (select sum(s2.activity = 'Finish')
              from starting s2
              where s2.id >= s.id
             ) as FinishCount
      from starting s
     ) s
group by FinishCount;

关于MySQL - 计算其他值之间出现的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21745029/

相关文章:

php - 在 SQL 查询中传递大量值的最佳方法?

Python:为什么我的数据库不显示在这个窗口中?

php - 如何确定 while 循环内 tep_db_fetch_array 的大小?

MySQL将索引计数重置为0

pandas - 如何计算具有多列整数的数据帧中行的重复项

PHP Mysql 如何让字段获得与自增id相同的值

MySQL 用户权限转储存储过程

java - 为什么我不能将用户输入添加到前端为 java 和后端为 mysql 的数据库中?

sql - 获取两行值不同的列名

php - 如何更改时间配置?