2016-04-28 5 views
2

は私が毎日のためにそれぞれの名前の値が含まれています。このはネティーザ/ 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 
.... 

のように見えるテーブルAを持って一列に複数の列に複数の行を結合します。私はすべての日付が正しくに表Aに、JOINのいくつかの種類を使用していた、その後

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 
... 

私の考えに入った中間テーブルを作成しようとしたこの

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    ... 

のように見える第二のテーブルを必要とします私は、これはSQLで行うことができる方法を見つけ出すのに苦労していた日付に対応した値をマッピングし、

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

ようs.th使用しています。私は基本的に、最初の日付シーケンスのためにすべての値をウィンドウ上に必要とします。いくつかの背景を与えるために、定期的な時間間隔の間、値が次のx日間にどのように挙動するかを見たいと思う。データ型は、すべての日付列の日付、値の名前と数値のVarcharです。 ValueDate + 1と+2は+1/2日を意味します。また、名前の数は時間の経過とともに一定に留まることも否定できない。

あなただけlead()をしたいのおかげ

+0

私には、これは2つの左の結合とピボットです。あなたの[netezzaのバージョン](http://www-01.ibm.com/support/docview.wss?uid=swg21669899)が 'pivoting'をサポートしていると仮定すると、動的SQLを使用して日付名を生成する必要があります特に列の数が可変である場合は列ヘッダー。 – xQbert

答えて

0

Iは所望のウィンドウサイズにROW_NUMBER()サブセレクト限界を書き込むことにより、所望の結果を得るための一つの方法を発見しました。一つは、初期テーブルの上に接合して旋回可能

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

使用することができる次のステップでこの

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 

など日付s.thあたり各エントリを与えます。これにより、日付ごとの任意の名前の組み合わせが可能になります。

1

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

私はあなたの問題文に関する不明瞭だ -

まず、あなたのデータで "日付" なら、あなたは言っていませんDate型、または日付のように見える文字列です。

"Value"は各データ行の主キーですか?または、それは "ValueDate + 1"の計算に使用される実際の値ですか?もしそうなら、どうですか?

「ValueDate」は単に「Date」の値ですか、「ValueDate + 1」は「Date」の後の日ですか?それとも、それは月ですか?

ValueDateは、「Date」と「Value」の日数の値になっていますか?

問題を再現し、データの種類を含めることはできますか?

表示する必要がある出力値のタイプとともに、式や数式の問題を説明できますか?

可能であれば、SQLでフォーマットする方法を説明できます。

は - エイダ

+0

データ型を追加しました.ValueDate + 1は、日付+ 1日の単純な値です。次の日に各「名前」がどのように変化するかを見ることができるように既存の値を並べ替えることについての公式はありません。値はすべてテーブルaから来ます – ThatQuantDude