2016-09-29 162 views
4

假設我有一個pageview事件列表,每個事件都有一個會話ID。對於每個活動,我希望在該活動的會話中添加按時間順序排列的第一個網頁瀏覽的時間和網址。例如,可以說我的事件在表test看起來像這樣:SQL:單個OVER子句可以支持多個窗口函數嗎?

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

我想產生以下SQL命令:

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 

窗口的功能似乎是去這裏的路,但我對他們來說很新。下面的語句產生所需的表,但我不知道,如果它是不理想的

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條款的兩倍。有沒有辦法使用單個OVER子句從會話中選擇按時間順序排列的第一個URL和時間戳?我正在使用SPARK SQL,但我會接受適用於多個主要SQL系統的任何答案。

+1

是的,您可以使用WINDOW關鍵字爲窗口引入一個名稱,並使用OVER多次引用該名稱。 (雖然我不知道apache spark-sql是否實現了這個功能) – joop

+0

感謝您的提示。我只是嘗試使用hive sql引用中指定的窗口函數,它的工作原理。你應該寫出答案 - 如果你不想,那麼我可以做到(但你贏了)。 – conradlee

回答

1

它可以使用WINDOW關鍵字命名窗口,然後可以在SELECT子句中引用:

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

感謝joop的提示。 – conradlee

相關問題