2017-05-18 3 views
1

J'ai une table qui x, y points et besoin de trouver des points où il y a moins de trois autres lignes dans le tableau avec une valeur plus élevée x ou y valeur plus élevée.Sélectionnez des lignes en fonction de la comparaison avec d'autres lignes dans la même vue

x | y 
-----+----- 
    85 | 996 
109 | 989 
116 | 987 
164 | 983 

     create or replace function sk(tableName text) 
      returns integer 
     as $$ 
     declare 
      count integer; 
      r record; 

     begin 
      count :=3; 
      for r in execute 'select * from TABLE' 
      if 
        loop 
        count := count - 1; 

        end loop; 
        return count; 

     end 
     $$ language plpgsql; 

Le résultat attendu est une nouvelle vue qui n'a que les points qui ont moins de 3 avec plus x ou y.

+1

Modifiez votre question et affichez les résultats souhaités. –

+1

"psql" n'est pas un nom valide pour Postgres, c'est le nom de l'interface de ligne de commande standard. Et vous n'avez pas besoin de "boucle", vous devez résoudre un problème. Le bouclage est une technique possible et rarement une approche efficace dans n'importe quel SGBDR. J'ai pris la liberté de clarifier un peu. –

Répondre

0

Pourquoi faire cela dans une fonction? Vous pouvez le faire avec une seule requête, tels que:

select t.x, t.y, count(t2.x) as numBiggerXY 
from t left join 
    t2 
    on t2.x > t.x or t2.y > t.y 
group by t.x, t.y; 

Vous pouvez en faire un drapeau:

select t.x, t.y, (count(t2.x) < 3) as biggerFlag 
from t left join 
    t2 
    on t2.x > t.x or t2.y > t.y 
group by t.x, t.y; 
+0

Vous travaillez avec 2 tables, mais la question en mentionne seulement une. 'GROUP BY' est manquant et même si vous l'ajoutez, la requête ne peut pas être dupliquée sur' (x, y) 'sauf si vous en faites plus. Finalement, c'est '<3' pas' <= 3'. –

0

En supposant une colonne PK id, donc c'est le cas de test:

CREATE TABLE tbl (id serial PRIMARY KEY, x int, y int); 
INSERT INTO tbl(x,y) VALUES 
    (85, 996) 
, (109, 989) 
, (116, 987) 
, (164, 983); 

Si vous n'avez pas de PK, créez-en un. Sinon, vous devez utiliser d'autres techniques dans la requête pour distinguer les doublons possibles sur (x,y) - qui n'ont pas été exclus.

SELECT t.*, count(t2.x) AS ct_greater 
FROM  tbl t 
LEFT JOIN tbl t2 ON t2.x > t.x OR t2.y > t.y 
GROUP BY t.id 
HAVING count(t2.x) < 3; 

résultat vide pour le cas de test car il y a toujours 3 autres lignes avec plus x ou plus y.