2016-04-28 6 views
2

У меня есть таблица А, которая выглядит, как этотРЕГИСТРИРУЙТЕСЬ несколько строк для нескольких столбцов в одной строке Netezza/Postgres

Date   Name  Value 
---------------------------- 
2015-01-01 A   12 
2015-01-01 B   13 
2015-01-01 C   10 
2015-01-01 D   9 
2015-01-01 E   15 
2015-01-01 F   11 
2015-01-02 A   1 
2015-01-02 B   2 
2015-01-02 C   3 
2015-01-02 D   4 
2015-01-02 E   5 
2015-01-02 F   6 
2015-01-03 A   7 
2015-01-03 B   8 
2015-01-03 C   9 
2015-01-03 D   10 
2015-01-03 E   15 
2015-01-03 F   16 
.... 

, который содержит значение для каждого имени в течение каждого дня. Мне нужен второй стол, который выглядит следующим образом

Date   Name ValueDate ValueDate+1  ValueDate+2 
-------------------------------------------------------------- 
2015-01-01 A   12   1    7 
2015-01-01 B   13   2    8 
2015-01-01 C   10   3    9 
2015-01-01 D   9   4    10 
2015-01-01 E   15   5    15 
2015-01-01 F   11   6    16 
2015-01-02 A   1   7    ... 
2015-01-02 B   2   8    ... 
2015-01-02 C   3   9    ... 
2015-01-02 D   4   10    ... 
2015-01-02 E   5   15    ... 
2015-01-02 F   6   16    ... 

Я попытался создать промежуточную таблицу, которая имеет все даты введены правильно

Date   Name ValueDate  ValueDate+1  ValueDate+2 
---------------------------------------------------------------- 
2015-01-01 A   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 B   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 C   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 D   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 E   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 F   2015-01-01 2015-01-02  2015-01-03 
... 

Моя идея тогда была использовать какой-то из JOIN на столе в к отобразить на нужные значения с датами и использовать s.th как

CASE WHEN Date = ValueDate THEN Value ELSE NULL END AS ValueDate+1 

Я изо всех сил, чтобы понять, как это может быть сделано в SQL. Мне по существу нужны все значения над окном для начальной последовательности дат. Чтобы дать некоторый фон, я хочу видеть на регулярном временном интервале, как значение ведет себя в следующие x дней. Datatypes - это Date для всех столбцов Date, Varchar для имени и числа для значений. Значение ValueDate + 1 и +2 означает +1/2 дня. Также нельзя исключать, что количество имен остается постоянным с течением времени.

благодарит

+0

Для меня это два левых соединения и стержень.если ваша [версия netezza] (http://www-01.ibm.com/support/docview.wss?uid=swg21669899) поддерживает 'поворот' ... вам может потребоваться использовать динамический sql для генерации имен дат как заголовок столбца, особенно если число столбцов является переменным. – xQbert

ответ

0

Я нашел один способ получения желаемых результатов, написав row_number() к югу выбери предел до нужного размера окна. Который дает каждый вход на дату s.th как этого

Date   Name  Value Row_Num 
--------------------------------------- 
2015-01-01 A   12  0 
2015-01-01 A   12  1 
2015-01-01 A   12  2 
2015-01-01 A   12  3 

В следующем шаге можно использовать

(Date + Row_Num*INTERVAL'1 DAY')::DATE 

, которые затем могут быть объединены в исходной таблице и поворачиваются. Это позволит использовать любую произвольную комбинацию имен в день.

1

Вы просто хотите lead():

select a.*, 
     lead(value) over (partition by name order by date) as value_1, 
     lead(value, 2) over (partition by name order by date) as value_2 
from a; 
+0

Спасибо за ответ, к сожалению, это не сработает, если имя подсчитывается за дату с течением времени, что я не могу исключить – ThatQuantDude

+0

@ Markus.london. , , Я не понимаю ваш комментарий. Это должно извлекать значение из «следующей» строки таблицы для каждого имени, где «следующий» является следующим по порядку по дате. Кажется, это то, о чем вы просите. –

+0

У меня могут быть случаи, когда, например, имя A отсутствует в течение нескольких дней, будет ли это работать? – ThatQuantDude

0

Я неясными о вашей постановке задачи -

Во-первых, вы не говорите, если "Дата" в ваших данных является типом даты или просто строкой, которая выглядит как дата.

«Значение» первичный ключ для каждой строки данных? Или это фактическое значение, используемое при вычислении «ValueDate + 1»? Если да, то как?

Является ли значение «ValueDate» значением «Дата» и «ValueDate + 1» на следующий день после «Даты»? Или это месяц спустя?

Предполагается, что значение ValueDate является значением дней «Дата» плюс «Значение»?

Не могли бы вы повторить проблему и включить типы данных?

Можете ли вы сформулировать проблему с уравнениями или формулами вместе с типом выходных значений, которые вам нужно показать?

Если вы можете, я могу показать вам, как отформатировать его в SQL.

- Ад

+0

Я добавил типы данных, ValueDate + 1 просто значение на дату + 1 день. Нет никаких формул о перестановке существующих значений таким образом, чтобы вы могли видеть, как изменяется каждое «Имя» в следующие дни. Все значения взяты из таблицы a – ThatQuantDude