Мне нужно сделать довольно сложную основу SQL, и сейчас я не уверен, как это можно сделать.
Скажем, у меня есть данные, которые выглядят так:
-----------------------------------------------------
| ID | UnixTimeStamp | Value |
-----------------------------------------------------
| 0 | 4000685 | 9 |
-----------------------------------------------------
| 0 | 4006250 | 2 |
-----------------------------------------------------
| 0 | 4012185 | 5 |
-----------------------------------------------------
| 0 | 4018385 | 3 |
-----------------------------------------------------
| 0 | 4030726 | 7 |
-----------------------------------------------------
| 1 | 4000685 | 23 |
Я хотел бы поворачиваться таким образом, чтобы столбцы составляли приращения временной отметки ближайшего 6000, а значения заполнялись столбцом значений и выполнялись. Например, приведенные выше данные будут преобразованы в:
-----------------------------------------------------------------------------
| ID | UnixTimeStamp_End | 0_Col | 6000_Col | 12000_Col |
-----------------------------------------------------------------------------
| 0 | 4000685 | Null | Null | 9 |
-----------------------------------------------------------------------------
| 0 | 4006250 | Null | 9 | 2 |
-----------------------------------------------------------------------------
| 0 | 4012185 | 9 | 2 | 5 |
-----------------------------------------------------------------------------
| 0 | 4018385 | 2 | 5 | 3 |
-----------------------------------------------------------------------------
| 0 | 4024000 | 5 | 3 | Null |
-----------------------------------------------------------------------------
| 0 | 4030726 | 3 | Null | 7 |
-----------------------------------------------------------------------------
| 1 | 4000685 | Null | Null | 23 |
Какой SQL-запрос мог бы сделать это?
EDIT: обратите внимание, что Null был вставлен в UnixTimeStamp_End 4024000, потому что не было отметки времени Unix, которая округляется до 4024000 с ближайшего 6000, так как существует пробел в 12000 между показанием 4018385 и показанием 4030726.
Также обратите внимание, что при изменении идентификатора опорный элемент необходимо "перезагрузить", как если бы он не видел никаких прошлых значений
Это далеко не идеально. Он использует дополнительную таблицу с базовыми метками времени.
http://sqlfiddle.com/#!9/645e1c/2
SELECT
res.idx,
res.period,
res.UnixTimeStamp,
CAST(@a := @b AS SIGNED),
CAST(@b := @c AS SIGNED),
@c := res.value
FROM
(SELECT tt.UnixTimeStamp period,
IF(t1.id IS NULL, 0, t1.id) idx,
t1.UnixTimeStamp ,
t1.value
FROM tt
LEFT JOIN t1
ON tt.id = t1.id
AND t1.UnixTimeStamp >= tt.UnixTimeStamp
AND t1.UnixTimeStamp < tt.UnixTimeStamp + 6000
ORDER BY tt.id ASC,tt.UnixTimeStamp ASC) res
INSERT
(4024000) в результате запроса. так, чтобы подделать это - мы должны знать, с чего начать? 4000685 + 6000 + ...? Но почему тогда 402400? оно должно иметь 5 как последнюю цифру.