我想为指定分区在一行中具有第一列的第一个值和第二列的最后一个值。为此,我创建了此查询:
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] 删除。
我来说两句