2017-05-18 3 views
1

Ich habe eine Tabelle, die x, y Punkte und müssen Punkte finden, wo es weniger als drei andere Zeilen in der Tabelle entweder mit einem höheren x Wert oder höher y Wert.Wählen Sie Zeilen basierend auf einen Vergleich mit anderen Zeilen in derselben Ansicht

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; 

Das erwartete Ergebnis ist eine neue Ansicht, die nur die Punkte hat, die weniger als 3 mit größeren x oder y.

+1

Bearbeiten Sie Ihre Frage und zeigen die Ergebnisse, die Sie wollen. –

+1

"psql" ist kein gültiger Name für Postgres, das ist der Name der Standard-Befehlszeilenschnittstelle. Und Sie müssen nicht "Schleife", müssen Sie ein Problem lösen. Schleifen ist eine mögliche Technik und selten ein effizienter Ansatz in jedem RDBMS. Ich habe mir die Freiheit genommen, etwas zu verdeutlichen. –

Antwort

0

Warum tun dies in einer Funktion? Sie können mit einer einzigen Abfrage dies tun, wie zum Beispiel:

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; 

Sie können diese sich in eine Fahne:

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

Sie arbeiten mit 2 Tabellen, aber die Frage erwähnt nur eine. 'GROUP BY' fehlt und selbst wenn Sie es hinzufügen, ist die Abfrage nicht für mögliche Duplikate auf' (x, y) 'geeignet, es sei denn, Sie tun mehr. Schließlich ist es <3 <= 3 <. –

0

eine PK-Säule Unter der Annahme id, so ist dies der Testfall:

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); 

Wenn Sie keine PK haben, erstellen. Andernfalls müssen Sie andere Techniken in der Abfrage verwenden, um mögliche Duplikate auf (x,y) zu unterscheiden - die nicht ausgeschlossen wurden.

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; 

Leeres Ergebnis für den Testfall, weil es immer drei andere Reihen mit größeren x oder größer y.

Verwandte Themen