Thread: Special sort querstion
Hello everyone, the following query SELECT id, start_lat, start_lng, end_lat, end_lng FROM strecken WHERE ST_Intersects(strecke, geomfromtext('POLYGON(( 52.5204252 13.3169317, 52.5407887 13.3169317, 52.5407887 13.3534097, 52.5204252 13.3534097, 52.5204252 13.3169317 ))')) ORDER BY id; produces by coincidence the following desired result: id start_lat start_lng end_lat end_lng 18074 52.5212087 13.3181119 52.5226187 13.3183479 18075 52.5226187 13.3183479 52.5237154 13.3189702 18076 52.5237154 13.3189702 52.5244204 13.3201289 18077 52.5244204 13.3201289 52.5248120 13.3217812 18095 52.5195701 13.3381855 52.5204710 13.3390224 18096 52.5204710 13.3390224 52.5213653 13.3393443 18097 52.5213653 13.3393443 52.5219529 13.3395588 18098 52.5219529 13.3395588 52.5223511 13.3400846 20293 52.5408279 13.3338833 52.5404625 13.3350205 20294 52.5404625 13.3350205 52.5395881 13.3385825 20295 52.5395881 13.3385825 52.5387398 13.3447623 Its desired because every single row end_lat and end_lng has the same value as the next row's start_lat and start_lng field (except last one). I would like to achieve the same result without using id column inside "order by" clause. Is that possible? How would that query look like?
Oh, actually every row of the same id-range has the same start_lat/start_lng coordinates as the predecessors end_lat/end_lng coordinates. But the question remains the same. Is there a way to do something like ORDER BY (start_lat = end_lat AND start_lng = end_lng) ? Or maybe another way to achieve the same result? Dominik Piekarski schrieb: > Hello everyone, > > the following query > SELECT id, start_lat, start_lng, end_lat, end_lng > FROM strecken > WHERE ST_Intersects(strecke, geomfromtext('POLYGON(( > 52.5204252 13.3169317, > 52.5407887 13.3169317, > 52.5407887 13.3534097, > 52.5204252 13.3534097, > 52.5204252 13.3169317 > ))')) ORDER BY id; > produces by coincidence the following desired result: > > id start_lat start_lng end_lat end_lng id range1 > 18074 52.5212087 13.3181119 52.5226187 13.3183479 > 18075 52.5226187 13.3183479 52.5237154 13.3189702 > 18076 52.5237154 13.3189702 52.5244204 13.3201289 > 18077 52.5244204 13.3201289 52.5248120 13.3217812 id range2 > 18095 52.5195701 13.3381855 52.5204710 13.3390224 > 18096 52.5204710 13.3390224 52.5213653 13.3393443 > 18097 52.5213653 13.3393443 52.5219529 13.3395588 > 18098 52.5219529 13.3395588 52.5223511 13.3400846 id range3 > 20293 52.5408279 13.3338833 52.5404625 13.3350205 > 20294 52.5404625 13.3350205 52.5395881 13.3385825 > 20295 52.5395881 13.3385825 52.5387398 13.3447623 > > Its desired because every single row end_lat and end_lng has the same > value as the next row's start_lat and start_lng field (except last one). > I would like to achieve the same result without using id column inside > "order by" clause. Is that possible? How would that query look like? >
I think it can not be done with default PostgreSQL functions and operators, because you must compare two different columns of two rows depending which row is on either side of the "<" comparision. But I think you can do this with the following steps: 1) create a new type as a 4-tupel of start_lat, end_lat, start_lng, end_lng. 2) write a comparison function for this type 3) write a SQL-Function to convert 4 values into your new type (for example: ToMyType(start_lat, end_lat, start_lnd, end_lng) returns MyType...) 4) use ToMyType in the order clause of your select If this would work, I'm interested in a working example code :-) -- ---> Dirk Jagdmann ----> http://cubic.org/~doj -----> http://llg.cubic.org
I think it can not be done with default PostgreSQL functions and operators, because you must compare two different columns of two rows depending which row is on either side of the "<" comparision. But I think you can do this with the following steps: 1) create a new type as a 4-tupel of start_lat, end_lat, start_lng, end_lng. 2) write a comparison function for this type 3) write a SQL-Function to convert 4 values into your new type (for example: ToMyType(start_lat, end_lat, start_lnd, end_lng) returns MyType...) 4) use ToMyType in the order clause of your select If this would work, I'm interested in a working example code :-) -- ---> Dirk Jagdmann ----> http://cubic.org/~doj -----> http://llg.cubic.org
On Fri, Mar 27, 2009 at 6:10 AM, Dominik Piekarski <d.piekarski@vivawasser.de> wrote: > Oh, actually every row of the same id-range has the same start_lat/start_lng > coordinates as the predecessors end_lat/end_lng coordinates. But the > question remains the same. Is there a way to do something like ORDER BY > (start_lat = end_lat AND start_lng = end_lng) ? Or maybe another way to > achieve the same result? Would something like order by start_lat-endlat, start_lng-end_lng OR case when start_lat=end_lat AND start_lng=end_lng then 0 else 1 end ???