SQL:一个OVER子句可以支持多个窗口函数吗?
假设我有一个pageview事件列表,每个事件都有一个会话id。对于每个事件,我想添加该事件会话中按时间顺序排列的第一个pageview的时间和URL。例如,假设我的事件在表SQL:一个OVER子句可以支持多个窗口函数吗?,sql,apache-spark-sql,spark-dataframe,window-functions,Sql,Apache Spark Sql,Spark Dataframe,Window Functions,假设我有一个pageview事件列表,每个事件都有一个会话id。对于每个事件,我想添加该事件会话中按时间顺序排列的第一个pageview的时间和URL。例如,假设我的事件在表test中,如下所示: uid | session_id | timestamp | url ---------------------------------------------------- u1 0 0 a.com/ u1 1 1
test
中,如下所示:
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系统的任何答案。可以使用窗口
关键字来命名一个窗口,然后可以在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 Spark SQL和HiveQL。是的,您可以使用window关键字为窗口引入名称,并使用OVER多次引用该名称。(不过,我不知道ApacheSparkSQL是否实现了这一点)谢谢您的提示。我刚刚尝试使用配置单元sql引用中指定的窗口函数,它可以正常工作。你应该写下答案——如果你不想,那么我可以做(但这是你应得的)。谢谢joop的提示。如果你还有
WHERE
子句,那么一定要把它放在窗口
子句之前。