目前,我有以下值表:
--------------------------------
| ID | Action | Time |
--------------------------------
| 1 | A | 01 |
| 1 | BB | 10 |
| 1 | C | 12 |
| 2 | C | 05 |
| 2 | A | 08 |
| 2 | BB | 17 |
| 2 | A | 26 |
| 2 | BB | 47 |
假设数据按时间
升序排列。
我希望每次调用时,当数据按 ID 分组时,有一个名为 BB_Time 的新列,其中包含 BB 与调用中前一个事件的时间差,看起来像:
----------------------------
| ID | ... | BB_Time |
----------------------------
| 1 | ... | 09 |
| 2 | ... | 21 |
如果 BB 在调用开始时发生,BB_Time
将等于 0,如果 BB 在调用中出现多次,则该列应返回最大时间差。
编辑:如果 BB 没有出现在调用中,则 NULL 或 0 都可以。
我能够破解的最接近的(?)仅限于 WHERE
子句中的 BB
操作并以这种方式跟踪时间,但这并没有' t 给出一个滞后。
想法?
最佳答案
有些人不信任 session 变量,但我发现只要你小心,它们是相对可靠的。免责声明:我相信 MySQL 没有正式定义用于评估 SELECT 结果字段的评估顺序。实际上,它似乎总是从左到右,这是该查询所依赖的,但是每当 MySQL Server 版本发生变化时,就需要考虑/重新评估这一点。另外,我在这里看到了其他相关问题,这些问题表明这种查询可能无法与 VIEW
一起“很好地发挥”。
SELECT ID, MAX(BB_Time) AS BB_Time
FROM (
SELECT ID, `Action`
, @prevID := IFNULL(@prevID, 0) AS prevID
, IF(`Action`<>'BB'
, 0
, IF(@prevID<>ID, 0, `Time` - IFNULL(@prevTime, `Time`))
) AS BB_Time
, @prevTime := `Time`
, @prevID := ID
FROM the_table
ORDER BY ID, `Time`
) AS subQ
GROUP BY ID
;
更新为显示所有 ID 值,其中 0 表示没有 BB 操作的 ID。
编辑:使用示例数据进行测试。第一次返回0,第二次就成功了。可能需要在选择之前将 @prev session 变量初始化为安全的值。
关于mysql - 返回 MySQL 中特定列值的滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31460868/