我写了一部分查询并且卡在了最后一部分。我到目前为止的代码:
SELECT uid,
x,
y
FROM (SELECT uid,
x,
y,
( Timediff(Max(ts), Min(ts)) ) idle_time
FROM test
WHERE speed = 0
GROUP BY x,
y,
uid
HAVING Count(*) > 0) t
WHERE idle_time > 1
ORDER BY uid
结果表是:
----------------------------------
| uId | x | y |
----------------------------------
| 1 | 110 | 20 | <-- Uid = 1 start position
----------------------------------
| 1 | 220 | 50 | <-- Uid = 1 end position
----------------------------------
| 2 | 30 | 15 | <-- Uid = 2 start position
----------------------------------
| 2 | 40 | 22 | <-- Uid = 2 end position
----------------------------------
我现在需要得到的是:
------------------------------------------------------
| uId | x_start | x_end | y _start | y_end |
------------------------------------------------------
| 1 | 110 | 220 | 20 | 50 |
------------------------------------------------------
| 2 | 30 | 40 | 15 | 22 |
------------------------------------------------------
结果将始终成对出现。这意味着可以有多个具有相同uId的行,只需要添加对。我知道这并不难,任何帮助都表示赞赏!!
修改
忘记提及,END的X和Y并不总是大于START,因为使用了真实的数据库地图坐标。
答案 0 :(得分:1)
没有一种漂亮的方法可以做到这一点,因为你不能在mySQL上使用CTE
首先,您需要在内部查询中返回时间戳
------------------------------------------
| uId | x | y | ts |
------------------------------------------
| 1 | 110 | 20 | 2017-11-23 15:01 |
------------------------------------------
| 1 | 220 | 50 | 2017-11-23 16:11 |
------------------------------------------
| 2 | 30 | 15 | 2017-11-24 05:20 |
------------------------------------------
| 2 | 40 | 22 | 2017-11-24 11:30 |
------------------------------------------
然后您可以编写以下查询:
为简单起见,我会致电您innerQuery
,因为您必须重复此代码。
SELECT q1.uid as uid
q1.x as x_start,
q1.y as y_start,
q2.x as x_end,
q2.y as y_end
FROM ( innerQuery ) as q1
JOIN ( innerQuery ) as q2
ON q1.uid = q2.uid
AND q1.ts < q2.ts