根据与同一视图中其他行的比较选择行

时间:2017-05-18 12:25:50

标签: sql postgresql plpgsql

我有一个x, y点的表,需要找到表中少于三个其他行的值较高x值或更高y值的点。< / p>

  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;

预期结果是一个新视图,其中只包含小于3且大xy的点。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)上可能存在的重复项 - 这些重复项尚未排除。

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;

测试用例的空结果,因为总有3个其他行x或更大y