PostgreSQL中window函数的第一个和最后一个值

米哈尔·施庞德(MichalŠpondr)

我想为指定分区在一行中具有第一列的第一个值和第二列的最后一个值。为此,我创建了此查询:

SELECT DISTINCT
b.machine_id,
batch,
timestamp_sta,
timestamp_stp,
FIRST_VALUE(timestamp_sta) OVER w AS batch_start,
LAST_VALUE(timestamp_stp) OVER w AS batch_end
FROM db_data.sta_stp AS a
JOIN db_data.ll_lu AS b
ON a.ll_lu_id=b.id
WINDOW w AS (PARTITION BY batch, machine_id ORDER BY timestamp_sta)
ORDER BY timestamp_sta, batch, machine_id;

但是,正如您在图像中看到的那样,batch_end列中返回的数据不正确。

batch_start列的timestamp_sta列的第一个值正确但是batch_end应该为“ 2012-09-17 10:49:45”,它等于同一行中的timestamp_stp

为什么会这样呢?

在此处输入图片说明

欧文·布兰德斯特

这个问题很老,但是这个解决方案比迄今为止发布的解决方案更简单,更快捷:

SELECT b.machine_id
     , batch
     , timestamp_sta
     , timestamp_stp
     , min(timestamp_sta) OVER w AS batch_start
     , max(timestamp_stp) OVER w AS batch_end
FROM   db_data.sta_stp a
JOIN   db_data.ll_lu   b ON a.ll_lu_id = b.id
WINDOW w AS (PARTITION BY batch, b.machine_id) -- No ORDER BY !
ORDER  BY timestamp_sta, batch, machine_id; -- why this ORDER BY?

如果将其添加ORDER BY到窗口框架定义中,ORDER BY则具有较大表达式的每一行都将以更高的帧开始。然后,整个分区都将min()first_value()返回“第一个”时间戳。ORDER BY在同一个分区中没有所有行的情况下,对等节点将获得所需的结果。

您添加的ORDER BY 作品(不是窗口框架定义中的作品,不是外部的作品),但似乎没有任何意义,并且使查询更加昂贵。您可能应该使用ORDER BY与您的窗框定义一致子句,以避免额外的排序费用:

... 
ORDER BY batch, b.machine_id, timestamp_sta, timestamp_stp;

我看不到DISTINCT此查询中的需要您可以根据需要添加它。或者DISTINCT ON ()但是,该ORDER BY条款变得更加相关。看到:

如果您需要同一行中的其他其他列(同时仍按时间戳排序),则使用FIRST_VALUE()的想法LAST_VALUE()可能是您的理想选择。您可能需要将此附加到窗口框架定义,然后

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

看到:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在PostgreSQL中的一行上获取第一个和最后一个值

熊猫从组中获取列的第一个和最后一个值

获取groupby中的第一个和最后一个值

删除组中的第一个和最后一个观测值

返回数组中的第一个和最后一个值

使用RLE从组中获取第一个和最后一个值

查找数组中的第一个、最后一个和中间值。返回最大的一个

Spark Window 函数:是否可以直接从第一个/最后一个函数找到的行中获取其他值?

Postgresql 查询每个范围的第一个和最后一个

熊猫将组分为第一个值和最后一个值

在一行中查找具有特定值的第一个和最后一个条目

根据列表的最后一个值和第一个值在 python 中附加嵌套列表

如何从pyspark的dataframe列中获取第一个值和最后一个值?

在列中查找第一个和最后一个值,然后获取其旁边的值

在laravel 5和mysql中获取groupby对象的第一个和最后一个值

如何打印第一个和最后一个值?

Groupby搜索第一个和最后一个True值

从数组获取第一个和最后一个值

获取区域包围的第一个和最后一个值的索引

如何使用pymongo获取第一个和最后一个日期值

矢量如何找到第一个和最后一个当前值

更改PHP行的第一个和最后一个值

删除第一个和最后一个出现列值的行

多个第一个和最后一个非NA值(按组)

数据框获取对应列的第一个和最后一个值

提取json数组/对象的第一个和最后一个值

基于第一个和最后一个值的时差

NA之前的第一个和最后一个值

选择数据集中的第一个,最后一个和单个观测值