2013-01-23 4 views
0

J'ai deux colonnes de coordonnées x, y dans une table d'une base de données Postgres.Recherche de paires max/min dans postgresSQL

je peux trouver les extrêmes en x et y en utilisant:

select min(x), max(x), min(y), max(y) 
from coords 

Comment attribuer ces variables quelque chose comme ceci:

select min(x) as xmin, max(x) as xmax, min(y) as ymin, max(y) as ymax 
from coords 

pour atteindre

select y 
from coords 
where x = xmin 

etc. ..obtenir les quatre points extrêmes dans le jeu de données demi-milliard de lignes? (le point de l'exercice)

l'instruction select désirée fonctionne mais je ne peux pas utiliser la clause "where" car il est dit que xmin n'est pas une colonne. Quelle est l'approche correcte, ou dans le cas improbable où j'utilise la bonne approche, quelle est la syntaxe correcte, s'il vous plaît?

Répondre

3

Une façon est avec une jointure et sous-requête:

select c.* 
from coords c join 
    (select min(x) as xmin, max(x) as xmax, min(y) as ymin, max(y) as ymax 
     from coords 
    ) clim 
    on c.x in (clim.xmin, clim.xmax) or c.y in (clim.ymin, clim.ymax) 

Une autre façon de le faire est avec des fonctions de fenêtre:

select c.* 
from (select c.*, 
      least(row_number() over (order by x), 
        row_number() over (order by x desc), 
        row_number() over (order by y), 
        row_number() over (order by y desc) 
       ) as seqnum 
     from coords c 
    ) c 
where seqnum = 1 

Et une autre façon, si vous voulez vraiment seulement 4 points est: Avec un tel nombre de lignes, tout fonctionnera plus vite si vous avez des index sur x et y. Dans ce cas, le dernier est probablement le plus rapide.

+0

Vous avez tout: D peut aussi bien vous voter =) – bonCodigo

+0

Lastest est le plus rapide - 600-640 ms par déclaration. – DHBI

Questions connexes