2017-10-11 19 views
0

GreenPlum大きなテーブル名にを購入すると、400万行以上の行が含まれているが購入されます。ここでは、この表の例である:特定の列でシフト操作のグループ化SQL

userId |  purchaseTime  | timeDiff 
------------------------------------------ 
17 | 2016-02-01 11:01:02 | 
17 | 2016-02-01 13:24:58 | 
17 | 2016-02-01 21:12:36 | 
67 | 2016-02-01 17:04:49 | 
84 | 2016-02-01 16:13:20 | 
94 | 2016-02-01 05:46:13 | 
94 | 2016-02-01 21:33:19 | 

テーブルが

私の目標は、時間の違いを含めることで、このテーブルを更新することである私の目標を理解するために、ユーザーIDとpurchaseTimeによって命じられました各ユーザーの現在の行と最後に購入した時刻との間

それは次のようになり作る:

userId |  purchaseTime  | timeDiff 
------------------------------------------ 
17 | 2016-02-01 11:01:02 | NULL 
17 | 2016-02-01 13:24:58 | 2:23:56 
17 | 2016-02-01 21:12:36 | 8:12:38 
67 | 2016-02-01 17:04:49 | NULL 
84 | 2016-02-01 16:13:20 | NULL 
94 | 2016-02-01 05:46:13 | NULL 
94 | 2016-02-01 21:33:19 | 16:13:06 

あなたの答えのいずれかから選択が私を助けました。今私は更新を行う必要がありますが、更新の近くで構文エラーが発生しています:

WITH tmp_table AS 
(
    SELECT userId , 
     purchaseTime , 
     purchaseTime - LAG(purchaseTime) 
     OVER (PARTITION BY userId ORDER BY purchaseTime) AS timeDiff 
    FROM purchases 
) 

UPDATE purchases SET timeDiff = tmp_table.timeDiff 
FROM tmp_table 
WHERE userId = tmp_table.userId 
AND purchaseTime = tmp_table.purchaseTime; 

誰でも私のテーブルを更新するのに役立つことができますか?

+0

ラグ関数を使用して、目的の結果を取得します。 – Madhukar

+0

テーブル全体を更新する場合は、新しいテーブルを作成する方がはるかに良いでしょう。基本的に、テーブル全体を更新すると、ディスク上のサイズが倍になります。 –

答えて

0

だから、あなたがする必要がアップデートを行うために、@mureinikからのクエリに自分自身を基づか次の操作を行います。アップデートで

UPDATE purchases 
SET timeDiff = tmp_table.timeDiff 
FROM (SELECT userId, purchaseTime , 
     (EXTRACT(epoch FROM purchaseTime - LAG(purchaseTime) OVER 
      (PARTITION BY userId ORDER BY purchaseTime))/60)::integer AS timeDiff 
     FROM purchases) AS tmp_table 
WHERE purchases.userId = tmp_table.userId 
AND purchases.timeDiff = tmp_table.timeDiff; 

あなたはEXTRACTepoch FROM文を持つことになりますが、それは間隔の秒数を返すためにです。数分で6\60で分けたければ、最後に丸めたい場合はintegerにキャストしてください。

1

あなたは、以前の購入日を見つけるために、lagウィンドウ関数を使用して、ちょうど2つを引くことができます。

SELECT userId, 
     purchaseTime, 
     purchaseTime - 
     LAG(purchaseTime) OVER 
      (PARTITION BY userId ORDER BY purchaseTime) AS timeDiff 
FROM purchases 
+0

@Mureinikありがとう、これは私が探していたものでしたが、私はGreenPlumの基本ユーザーです。私のテーブルを更新する方法を教えてくれますか? –

関連する問題