基于舍入值的滚动sql pivot

bxjv4tth  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(405)

我需要做一个相当复杂的sql透视,现在我还不确定怎么做。
假设我有这样的数据

-----------------------------------------------------
|     ID     |     UnixTimeStamp     |    Value     |
-----------------------------------------------------
|      0     |     4000685           |      9       |
-----------------------------------------------------
|      0     |     4006250           |      2       |
-----------------------------------------------------
|      0     |     4012185           |      5       |
-----------------------------------------------------
|      0     |     4018385           |      3       |
-----------------------------------------------------
|      0     |     4030726           |      7       |
-----------------------------------------------------
|      1     |     4000685           |     23       |

我想以这样一种方式来透视,使列是最接近6000的时间戳增量,值用value列填充,并且将是滚动的。例如,上述数据将转换为:

-----------------------------------------------------------------------------
|     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查询可以做到这一点?
编辑:注意,在4024000 unixtimestamp\u端插入了null,因为没有从最接近的6000取整到4024000的unix时间戳条目,因为4018385读数和4030726读数之间有12000的间隙。
还要注意,当id改变时,pivot需要“重置”,就好像它没有看到任何过去的值一样

wd2eg0qa

wd2eg0qa1#

这还远远不够完美。它使用带有基本时间戳的额外表。
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

相关问题