MySQL查询行序列

时间:2015-07-20 14:32:59

标签: mysql database

有没有办法在MySQL中表达以下查询:

让表格具有行A,B,C,D,E ... Z的类型,每行代表一个事件。找到按时间戳排序的所有事件序列A,..,B,...,C的时间戳和id,以便时间戳(C) - 时间戳(A)< THRESH。

例如,请考虑下表

let viewHeight: CGFloat = 80.0

func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    startContentOffsetY = scrollView.contentOffset.y
}

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    targetContentOffsetY = targetContentOffset.memory.y
    if startContentOffsetY - targetContentOffsetY < 0 {
        scrollDirection = ScrollDirection.Bottom.rawValue
    } else {
        scrollDirection = ScrollDirection.Top.rawValue
    }
    let gap = targetContentOffsetY % viewHeight
    var offset: CGFloat = 0.0
    if (targetContentOffsetY - gap) % viewHeight == 0 {
        offset = -gap * scrollDirection
    } else {
        offset = gap * scrollDirection
    }
    let newTarget = targetContentOffsetY + (offset * scrollDirection)
    targetContentOffset.memory.y = newTarget
}

具有Thresh = 10mins的查询的行应该产生以下行:

| 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 |  

了解A,B和C的最后一个三联体是如何存在的。最后一个A事件和最后一个C事件之间的时间距离大于Thresh。

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

编辑:提供了一个示例

1 个答案:

答案 0 :(得分: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
)