2017-05-18 3 views
1

という値を持つテーブルがあり、テーブル内に他の行が3つ未満のポイントを見つける必要があります。同じビュー内の他の行との比較に基づいて行を選択

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; 

期待される結果は、より大きなx又はyで3未満を有する点のみを持つ新しい図です。

+1

質問を編集して、必要な結果を表示してください。 –

+1

"psql"はPostgresの有効な名前ではありません。標準のコマンドラインインターフェイスの名前です。そして、あなたは "ループする"必要はありません、あなたは問題を解決する必要があります。ループは1つの可能な手法であり、あらゆるRDBMSでの効率的なアプローチではありません。私は少し明確にするために自由を取った。 –

答えて

0

なぜこれを関数で行うのですか?あなたのような、単一のクエリでこれを行うことができます。

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; 
あなたはフラグにこれを回すことができる

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

2つのテーブルで作業しますが、質問には1つのテーブルだけが含まれています。 'GROUP BY'が欠けていて、あなたがそれを追加したとしても、あなたがそれ以上のことをしない限り、クエリーは'(x、y) 'に可能な重複に適合しません。最後に、 '<3'ではなく '<3 'です。 –

0

PK列idと仮定すると、これはテストケースである:

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

PKがない場合は作成してください。そうでなければ、クエリーで他のテクニックを使用して、(x,y)の可能な重複を区別しなければなりません。他の3行は常に存在しているので、テストケースのため

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; 

空の結果x大きくなったりyを大きめ。

関連する問題