在圆角值上滚动SQL数据透视表

时间:2018-01-18 20:02:04

标签: mysql pivot

我需要做一个非常复杂的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更改时,枢轴需要"重置"好像它没有看到任何过去的值

1 个答案:

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