返回数据立方体的 PostgreSQL 函数
PostgreSQL function returning a data cube
首先,iceberg-cube 查询定义为
假设我有一个关系item,location,year,supplier,unit_sales
,
我想写一个 plpgsql
函数作为
图像中查询的包装器,用于指定参数 N
,
像这样:
create or replace function iceberg_query( percentage integer )
returns cube
/* Code here */
as
$$
declare
numrows int;
begin
select count(*) into numrows from sales;
select item, location, year, count(*)
from sales
group by cube(item,location,year)
having count(*) >= numrows*percentage/100;
end;
$$ language 'plpgsql'
我需要向 Code here
部分添加什么才能使其正常工作?如何在 plpgsql
中将数据立方体指定为 return 类型?
要使您的 plpgsql 函数正常工作,您需要一个 RETURNS
子句来匹配您的 return。你实际上需要 return 一些东西。我想:
CREATE OR REPLACE FUNCTION iceberg_query ( percentage numeric)
<b>RETURNS TABLE (item ?TYPE?, location ?TYPE?, year ?TYPE?, ct bigint)</b>
AS
$func$
DECLARE
numrows bigint := (SELECT count(*) FROM sales);
BEGIN
<b>RETURN QUERY</b>
SELECT s.item, s.location, s.year, count(*)
FROM sales s
GROUP BY cube(s.item,s.location,s.year)
HAVING count(*) >= numrows * percentage / 100;
END
$func$ LANGUAGE plpgsql;
用实际(未公开)数据类型替换占位符 ?TYPE?
。
调用函数:
SELECT * FROM iceberg_query (10);
请注意我如何 table 限定查询中的所有列名以避免与同名的新 OUT
参数发生命名冲突。
并注意使用 numeric
而不是 Scoots 在 .
中指出的 integer
相关:
- How to return result of a SELECT inside a function in PostgreSQL?
- plpgsql error "RETURN NEXT cannot have a parameter in function with OUT parameters" in table-returning function
旁白:您不需要一个函数。这个普通的 SQL 查询做同样的事情:
SELECT s.item, s.location, s.year, count(*)
FROM sales s
GROUP BY cube(s.item,s.location,s.year)
HAVING count(*) >= (SELECT count(*) * $percentage / 100 FROM sales); -- your pct here
提供数字文字(10.0
,而不是 10
)以避免整数除法和随之而来的舍入。
首先,iceberg-cube 查询定义为
假设我有一个关系item,location,year,supplier,unit_sales
,
我想写一个 plpgsql
函数作为
图像中查询的包装器,用于指定参数 N
,
像这样:
create or replace function iceberg_query( percentage integer )
returns cube
/* Code here */
as
$$
declare
numrows int;
begin
select count(*) into numrows from sales;
select item, location, year, count(*)
from sales
group by cube(item,location,year)
having count(*) >= numrows*percentage/100;
end;
$$ language 'plpgsql'
我需要向 Code here
部分添加什么才能使其正常工作?如何在 plpgsql
中将数据立方体指定为 return 类型?
要使您的 plpgsql 函数正常工作,您需要一个 RETURNS
子句来匹配您的 return。你实际上需要 return 一些东西。我想:
CREATE OR REPLACE FUNCTION iceberg_query ( percentage numeric)
<b>RETURNS TABLE (item ?TYPE?, location ?TYPE?, year ?TYPE?, ct bigint)</b>
AS
$func$
DECLARE
numrows bigint := (SELECT count(*) FROM sales);
BEGIN
<b>RETURN QUERY</b>
SELECT s.item, s.location, s.year, count(*)
FROM sales s
GROUP BY cube(s.item,s.location,s.year)
HAVING count(*) >= numrows * percentage / 100;
END
$func$ LANGUAGE plpgsql;
用实际(未公开)数据类型替换占位符 ?TYPE?
。
调用函数:
SELECT * FROM iceberg_query (10);
请注意我如何 table 限定查询中的所有列名以避免与同名的新 OUT
参数发生命名冲突。
并注意使用 numeric
而不是 Scoots 在
integer
相关:
- How to return result of a SELECT inside a function in PostgreSQL?
- plpgsql error "RETURN NEXT cannot have a parameter in function with OUT parameters" in table-returning function
旁白:您不需要一个函数。这个普通的 SQL 查询做同样的事情:
SELECT s.item, s.location, s.year, count(*)
FROM sales s
GROUP BY cube(s.item,s.location,s.year)
HAVING count(*) >= (SELECT count(*) * $percentage / 100 FROM sales); -- your pct here
提供数字文字(10.0
,而不是 10
)以避免整数除法和随之而来的舍入。