sql - SQL (Hive):在使用 GROUP BY 进行聚合时使用窗口函数
问题描述
CREATE EXTERNAL TABLE tmp (
id STRING,
updated_at TIMESTAMP,
location STRING,
direction STRING
)
LOCATION 's3://path';
我需要对字段进行聚合和计数,同时id
选择相对于组内最新的和(分区再次打开)。location
direction
timestamp
id
到目前为止,我想出了以下查询,首先利用窗口函数,然后再分组:
SELECT
b.id,
MAX(b.latest_location) AS "latest_location", -- It seems it is not possible to use first_value() on GROUP BY
MAX(b.latest_direction) AS "latest_direction",
COUNT(*) AS "total"
FROM (
SELECT
a.id,
first_value(a.location) OVER (PARTITION BY a.id ORDER BY a.updated_at DESC) AS "latest_location",
first_value(a.direction) OVER (PARTITION BY a.id ORDER BY a.updated_at DESC) AS "latest_direction"
FROM tmp a
) b
GROUP BY b.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
做这里所做的事情。
推荐阅读
- r - 为什么当我增加 maxit 时 nnet 会给出不同的输出以及如何优化 maxit 值?
- c# - C#:如何将十进制转换为字符串而不转换为指数表示
- java - 发送一个代理参数以影响 Anylogic 中的另一个代理
- python - 尽管内部存在小部件,但 Canvas bbox 方法返回 None
- node.js - 多部分/表单数据请求失败。直播意外结束
- php - 的优先级和含义!PHP中的运算符
- c# - 自定义拖放 UWP
- android - Android Retrofit Bearer Token 授权
- angular-material2 - 如何将 scss 文件中的 mixin $variable 分配给 html 元素的类
- git - Codefreeze 是否违反了持续交付的原则?