问题描述
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;