Роллинг SQL Pivot на округленных значениях

0

Мне нужно сделать довольно сложную основу 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.

Также обратите внимание, что при изменении идентификатора опорный элемент необходимо "перезагрузить", как если бы он не видел никаких прошлых значений

  • 0
    Вы хотите создать новую таблицу? или вы хотите выполнить запрос, чтобы получить этот результат без создания новой таблицы? Омнате.Вы не INSERT (4024000) в результате запроса. так, чтобы подделать это - мы должны знать, с чего начать? 4000685 + 6000 + ...? Но почему тогда 402400? оно должно иметь 5 как последнюю цифру.
  • 0
    вставка может иметь 5 в конце, если округлить до 4024000. Редактировать: Кроме того, я не против делать вставки на копии исходных данных, но не на самих исходных данных.
Показать ещё 1 комментарий
Теги:
pivot

1 ответ

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
  • 0
    когда я пытаюсь сделать это с несколькими значениями, я думаю, что что-то идет не так sqlfiddle.com/#!9/645e1c/1
  • 0
    sqlfiddle.com/#!9/645e1c/2
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню