在我下面的代码中,我注释掉了我认为是冗余排序子句的行。我检查了有和没有评论的结果(行值),结果是一样的。我只是想知道是否有任何情况我在第二个和第四个 CTE 中注释掉的两个 order by 并不是真正多余的。
speed_dataset as (
select uc_id, imei, points_geom, time_created, st_distance((points_geom::geography),lag(points_geom::geography) over (partition by imei order by time_created))
/ nullif(( EXTRACT(EPOCH FROM time_created) - EXTRACT(EPOCH FROM LAG(time_created) OVER(PARTITION BY imei ORDER BY time_created)))::FLOAT8,0) as speed
from orig_dataset
order by imei,time_created
)
,
subset_speed as (
select uc_id, ROW_NUMBER() OVER (ORDER BY (time_created)) AS row_id, speed, imei,points_geom ,time_created
from speed_dataset sd
where speed < 0.1 or speed between 0.75 and 2
--order by time_created
)
,
leading_speeds as (
select *,lead (speed) over (partition by imei order by time_created) as lead_speed from subset_speed
)
,
subset_cr as (
select * from leading_speeds
where
(
(speed < 0.1 and lead_speed between 0.75 and 2)
or
(speed between 0.75 and 2 and lead_speed < 0.1)
)
--order by imei,time_created
)
,
clustering as(
SELECT uc_id,row_id,imei, speed, points_geom ,time_created, ST_ClusterDBSCAN(st_transform(points_geom,24313),eps := 150, minPoints := 3)
OVER(ORDER BY row_id) AS cluster_id FROM subset_cr
)
你的直觉是对的。通常,您应该 never 在 CTE 或视图定义中使用
ORDER BY
,除非您将它与 DISTINCT ON (..)
或 LIMIT
/FETCH FIRST ... ROWS ONLY
结合使用。