PostgreSQL函数返回数据立方体

时间:2019-03-19 11:32:51

标签: sql postgresql plpgsql olap

首先,iceberg-cube查询的定义如下 enter image description here

假设我有一个恋人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中将数据立方体指定为返回类型?

1 个答案:

答案 0 :(得分:1)

要使您的plpgsql函数正常工作,您需要一个RETURNS子句来匹配返回的子句。您实际上需要返回一些东西。我想:

CREATE OR REPLACE FUNCTION iceberg_query ( percentage numeric) 
  RETURNS TABLE (item ?TYPE?, location ?TYPE?, year ?TYPE?, ct bigint)
AS
$func$
DECLARE
    numrows bigint := (SELECT count(*) FROM sales);
BEGIN
   RETURN QUERY
   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);

请注意我如何对查询中的所有列名进行表限定,以避免与新的同名OUT参数命名冲突。

请注意,使用numeric代替comment中酷航所指出的integer

相关:

此外:您不需要 为此功能。这个简单的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)以避免整数除法和随之而来的舍入。