2016-09-29 8 views
4

私はページビューイベントのリストを持っているとしましょう。それぞれのイベントIDはセッションIDです。各イベントについて、そのイベントのセッションで時間順に最初のページビューの時間とURLを追加したいと思います。SQL:単一のOVER句で複数のウィンドウ関数をサポートできますか?

uid | session_id | timestamp | url  | s_timestamp | s_url 
--------------------------------------------------------------------- 
u1 0   0   a.com/  0    a.com/ 
u1 1   1   a.com/p1 1    a.com/p1 
u1 1   2   a.com/p2 1    a.com/p1 

ウィンドウ関数は、ここに行くための方法であるように見える:

uid | session_id | timestamp | url 
---------------------------------------------------- 
u1 0   0   a.com/ 
u1 1   1   a.com/p1 
u1 1   2   a.com/p2 

は、私は次のように生成するSQLコマンドをしたい:例えば、私のイベントは次のようになりますテーブルtestであると言うことができますしかし、私はそれらにかなり新しいです。次の文は、目的のテーブルを生成しますが、それは特に

SELECT 
    uid, 
    session_id, 
    timestamp, 
    url, 
    first_value(url) OVER (PARTITION BY uid, session_id ORDER BY timestamp ASC) s_url, 
    first_value(timestamp) OVER (PARTITION BY uid, session_id ORDER BY timestamp ASC) s_timestamp 
FROM test 

次善のだ場合、私は思ったんだけど、私が二回OVER句を使用することを間違っているようです。 1つのOVER句を使用してセッションから時間順に最初のURLとタイムスタンプを選択する方法はありますか?私はSPARK SQLを使用していますが、私は複数の主要なSQLシステムに適用できる答えを受け入れます。

SELECT 
    uid, 
    session_id, 
    timestamp, 
    url, 
    first_value(url) OVER w s_url, 
    first_value(timestamp) OVER w s_timestamp 
FROM test 
WINDOW w AS (PARTITION BY uid, session_id ORDER BY timestamp ASC) 

これはApacheのスパークSQLとHiveQLに動作します:

+1

はい、WINDOWキーワードを使用してウィンドウの名前を導入し、その名前をOVERを使用して複数回参照することができます。 (私はapache spark-sqlがこれを実装しているかどうかわかりません) – joop

+0

チップをありがとう。私はちょうどハイブSQLリファレンスで指定されたウィンドウ関数を使用してみました、そしてそれは動作します。あなたは答えを書くべきです - あなたがしたくなければ、私はそれをすることができます(しかしあなたはそれを獲得しました)。 – conradlee

答えて

1

その後、SELECT句で参照することができ、ウィンドウに名前を付けるためにWINDOWキーワードを使用することが可能です。

+1

チップのおかげでjoop。 – conradlee

関連する問題