我有一个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且大x
或y
的点。
答案 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
。