Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:一个OVER子句可以支持多个窗口函数吗?_Sql_Apache Spark Sql_Spark Dataframe_Window Functions - Fatal编程技术网

SQL:一个OVER子句可以支持多个窗口函数吗?

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

假设我有一个pageview事件列表,每个事件都有一个会话id。对于每个事件,我想添加该事件会话中按时间顺序排列的第一个pageview的时间和URL。例如,假设我的事件在表
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
子句,那么一定要把它放在
窗口
子句之前。