【问题标题】:How to define multiple range clauses in WindowSpec?如何在 WindowSpec 中定义多个范围子句?
【发布时间】:2016-07-24 12:43:30
【问题描述】:

在 SparkSQL 中,可以定义具有 2+ 列顺序的窗口查询,但似乎无法根据这些列定义范围子句。

例如,

select
row_id,
count(*) over (
    partition by group_id
    order by filter_key1, filter_key2
    range between 12 preceding and 12 following
    range between 5 preceding and 1 preceding
) as the_count
from table

上述失败(虽然可能语法不正确?手指交叉......)

可以在一个类似上面的语句中完成吗?

【问题讨论】:

    标签: sql apache-spark hive apache-spark-sql hiveql


    【解决方案1】:

    不,只允许一个范围。但不要绝望。 count(*) 是加法:

    select row_id,
           (count(*) over (partition by group_id
                           order by filter_key1, filter_key2
                           range between 12 preceding and 12 following
                          ) +
            count(*) over (partition by group_id
                           order by filter_key1, filter_key2
                           range between 5 preceding and 1 preceding
                          )
           ) as the_count
    from table
    

    这个特殊的例子看起来很奇怪,因为范围是重叠的。也许这就是你的意图。

    根据你的问题,我想知道你是否想要:

    select row_id,
           (count(*) over (partition by group_id
                           order by filter_key1
                           range between 12 preceding and 12 following
                          ) +
            count(*) over (partition by group_id
                           order by filter_key2
                           range between 5 preceding and 1 preceding
                          )
           ) as the_count
    from table
    

    【讨论】:

    • 目的是在一个时间范围内进行聚合,该时间范围将开始截断到一天的开始,并将结束保留在前面的记录中。所以,有点尴尬,因为我想得到两个过滤器之间的交集。重申一下,我希望所有记录从 N 天前(从 00:00 开始)直到当前时间(可能在一天的中午)。
    • 如果数据不相交,你的第二个例子会很棒。
    • @taw 。 . .您应该用样本数据和期望的结果提出另一个问题。这个问题似乎与您正在寻找的完全不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2012-02-14
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多