Обсуждение: Special sort querstion

Поиск
Список
Период
Сортировка

Special sort querstion

От
Dominik Piekarski
Дата:
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?




Add: Special sort querstion

От
Dominik Piekarski
Дата:
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?
>



Re: Add: Special sort querstion

От
Dirk Jagdmann
Дата:
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


Re: Add: Special sort querstion

От
Dirk Jagdmann
Дата:
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


Re: Add: Special sort querstion

От
Scott Marlowe
Дата:
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

???