SELECT CASE WHEN R.seq = 0 THEN geom WHEN ST_DWithin(ST_StartPoint(geom),ST_EndPoint(LAG(R.geom,1) over (ORDER BY R.seq)),1) THEN R.geom WHEN ST_DWithin(ST_StartPoint(geom),ST_StartPoint(LAG(R.geom,1) over (ORDER BY R.seq)),1) AND ST_DWithin(ST_EndPoint(LAG(R.geom,1) over (ORDER BY R.seq)),ST_StartPoint(LAG(geom,2) over (ORDER BY R.seq)),1) THEN R.geom WHEN ST_DWithin(ST_StartPoint(geom),ST_StartPoint(LAG(R.geom,1) over (ORDER BY R.seq)),1) AND ST_DWithin(ST_EndPoint(LAG(R.geom,1) over (ORDER BY R.seq)),ST_EndPoint(LAG(geom,2) over (ORDER BY R.seq)),1) THEN R.geom ELSE R.reverse END AS geom, R.seq FROM route R