我需要做一个非常复杂的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查询可以执行此操作吗?
编辑:注意Null是在4024000 UnixTimeStamp_End处插入的,因为没有Unix时间戳条目从最接近的6000转到4024000,因为4018385读数与4030726之间存在~12000差距读数。
另请注意,当ID更改时,枢轴需要"重置"好像它没有看到任何过去的值
答案 0 :(得分:1)
远非完美。 它使用带有基本时间戳的额外表格。
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