SQLHive:在与GROUP BY聚合时使用窗口函数

问题描述

我在AthenaHive / Presto)中有下表:

CREATE EXTERNAL TABLE tmp (
    id STRING,updated_at TIMESTAMP,location STRING,direction STRING
)
LOCATION 's3://path'; 

我需要汇总并依靠id字段,同时选择相对于组中最新location的{​​{1}}和direction(分区再次位于timestamp上。

到目前为止,我首先想到了以下利用窗口函数并在之后进行分组的查询

id

我首先尝试通过聚合和窗口聚合同时进行分组,但是似乎引擎不允许这样做。是否有可能编写更有效的查询(也许没有子查询)?

解决方法

SELECT DISTINCT
    id,first_value(a.location)  OVER (PARTITION BY id ORDER BY updated_at DESC) AS latest_location,first_value(a.direction) OVER (PARTITION BY id ORDER BY updated_at DESC) AS latest_direction,count(*) OVER (PARTITION BY id) as total
FROM tmp

在您的原始查询中,max实际上是一个虚拟聚合,因为所有行都具有相同的值。 group by实际上是在distinct所做的事情。

,

您可以混合使用窗口函数和聚合函数。 。 。但是从另一个方向来看:首先是聚合,然后是窗口函数。

也就是说,如果您消除聚合,您的查询应该会更快。只需使用row_number()并进行过滤:

SELECT a.id,a.location,a.updated_at
FROM (SELECT a.*,ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY a.updated_at DESC) AS seqnum
      FROM tmp a
     ) a
WHERE seqnum = 1;