2015-07-20 68 views
0

是否有表达在MySQL以下查询方式:MySQL查询为行序列

让一台具有类型行的A,B,C,d,E ... Z和每一行代表一个事件。查找按时间戳排序的所有事件序列A,..,B,...,C的时间戳和ID,以便时间戳(C) - 时间戳(A)<阈值。

例如,考虑下表

| type | timestamp | id | 
|------+-----------+-----| 
| Z |  19:00 | 20 | 
| A |  19:01 | 21 | 
|  |   |  | 
| . |  ... | .. | 
|  |   |  | 
| A |  20:13 | 50 | * 
| B |  20:14 | 51 | * 
| D |  20:17 | 52 | 
| C |  20:19 | 53 | * 
|  |   |  | 
| . |  ... | .. | 
|  |   |  | 
| A |  22:13 | 80 | * 
| D |  22:14 | 81 | 
| B |  22:15 | 82 | * 
| K |  22:16 | 83 | 
| J |  22:17 | 84 | 
| C |  22:19 | 85 | * 
|  |   |  | 
| . |  ... | .. | 
|  |   |  | 
| A |  23:13 | 100 | 
| B |  23:14 | 101 | 
| C |  23:50 | 102 | 

与Thresh的= 10分钟查询应沿着线产生的东西的行:

| A_id | B_id | C_id | 
|------+------+------| 
| 50 | 51 | 53 | 
| 80 | 82 | 85 | 

怎么看A,B的最后一个三重C不存在。最后一个A事件和最后一个C事件之间的时间距离大于Thresh。

我怀疑答案会是“如果你需要问这样的问题,MySQL不是正确的工具”。在那种情况下,后续是哪个数据库是处理这类任务的好候选者?

编辑:提供了一个示例

+0

你能提供更好的例子吗?目前还不清楚你在问什么。看起来你可能会问如何找到一个行组合,其时间戳之间的差值小于某个值,但我不确定。 –

+0

我编辑了我的问题 – fakedrake

回答

2

我认为你可以使用自表达这种联接:

SELECT A.id as A_id, B.id as B_id, C.id as C_id 
FROM (
    SELECT * 
    FROM the_table 
    WHERE type = 'A' 
) A 
JOIN (
    SELECT * 
    FROM the_table 
    WHERE type = 'B' 
) B 
JOIN (
    SELECT * 
    FROM the_table 
    WHERE type = 'C' 
) C ON (
    (C.timestamp - A.timestamp) < 10 -- threshold here 
    AND B.timestamp BETWEEN A.timestamp AND C.timestamp 
)