2016-11-03 2 views
0

クリックストリームデータのセッションIDを作成しています。ユーザが自分のアクティビティ(リンクチェーンを持つレコード間の時間差)の間に30分以上アクティブでない場合、新しいセッションIDが作成され、割り当てられます。このRedshift Postgresqlクエリは、UPDATE文を使用して最適化できますか?

現時点では、この新しいセッションIDをメインテーブルで利用できるデータから別の列として割り当てて、まったく新しいテーブルを作成することができました。

これは計算上高価なクエリであり、新しいテーブル全体を作成するため(メインテーブルが同時に存在する場合)、記憶領域を占有します。この新しいテーブルが作成されたら、私はメインテーブルを削除しなければならなかった。

セッションIDを割り当てることができ、新しいテーブルを作成せずにプロセス全体を終了できますか? 最適化されたクエリはRedshift Postgresqlで動作する必要があります。

CREATE TABLE <new_table_name> AS 
SELECT * , userid || '_' || SUM(session) OVER (PARTITION BY userid ORDER BY date rows unbounded preceding) AS session_id 
FROM (
    SELECT * 
    , CASE 
       WHEN EXTRACT(EPOCH FROM date) - LAG(EXTRACT(EPOCH FROM date)) OVER (PARTITION BY userid ORDER BY date) >= 30 * 60 
       THEN 1 
       WHEN row_number() over (partition by userid order by date) = 1 
       THEN 1 
     ELSE 0 
     END as session 
    FROM 
     <table_name> 
); 

答えて

0

これは(セッション列を追加した後)ですか?

UPDATE <table_name> SET session=s.session 
FROM (
    SELECT user_id, date, 
     CASE 
     WHEN EXTRACT(EPOCH FROM date) - LAG(EXTRACT(EPOCH FROM date)) 
      OVER (PARTITION BY userid ORDER BY date) >= 30 * 60 THEN 1 
     WHEN row_number() over (partition by userid order by date) = 1 THEN 1 
     ELSE 0 END as session 
    FROM <table_name> 
) s where <table_name>.user_id = s.user_id and <table_name>.date = s.date 
関連する問題