【问题标题】:SQL: Can a single OVER clause support multiple window functions?SQL:单个 OVER 子句可以支持多个窗口函数吗?
【发布时间】:2017-02-07 19:53:57
【问题描述】:

假设我有一个综合浏览事件列表,每个事件都有一个会话 ID。对于每个事件,我想在该事件的会话中添加按时间顺序排列的第一个网页浏览的时间和 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 系统的任何答案。

【问题讨论】:

  • 是的,您可以使用 WINDOW 关键字为窗口命名,并使用 OVER 多次引用该名称。 (不过我不知道 apache spark-sql 是否实现了这个)
  • 感谢您的提示。我刚刚尝试使用 hive sql 参考中指定的窗口函数,它可以工作。你应该写下答案——如果你不想写,那我可以写(但你应得的)。

标签: sql apache-spark-sql spark-dataframe window-functions


【解决方案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 Spark SQL 和 HiveQL。

【讨论】:

  • 感谢乔普的提示。
  • 如果您还有WHERE 子句,请确保将其放在 WINDOW 子句之前。
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2017-12-27
  • 2014-03-26
  • 2017-01-15
  • 1970-01-01
相关资源
最近更新 更多