【问题标题】:Calculate MAX VALUE AND SUM AT THE SAME TIME同时计算最大值和总和
【发布时间】:2019-09-28 10:52:41
【问题描述】:

对于我的项目,我正在创建一些自定义的 faggregate 函数,用于应用差异隐私。 到目前为止,我能够实现 MAX 和 MIN 函数,添加了一些拉普拉斯噪声。 我在使用 SUM_LAPLACE 聚合时遇到问题。 我的上限(灵敏度),应该是列中 MAX 值的绝对值。

如何同时计算最大值和总和,然后将两个输出值传递给函数?

CREATE OR REPLACE FUNCTION calculateSum(real,real,OUT real, OUT real) AS $$
DECLARE 
   sumValue real := 0;
       max_v real;
BEGIN
   IF $1 IS NULL THEN
    sumValue := sumValue + $2;
   ELSIF $2 IS NULL THEN
    sumValue := sumValue + $1;
   ELSIF $2 IS NULL AND $1 IS NULL THEN
    sumValue := sumValue;
   ELSE
    sumValue := $1 + $2;
   END IF;
       max_v = searchmaximumvalue($1,$2);
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION addLaplacianNoiseSum(real) RETURNS real AS $$
DECLARE
    epsilon real := 1.2;
    sensivity real := (epsilon * 2) + ($1/2);
    laplaceDistribution real;
 BEGIN
 laplaceDistribution := sensivity / (epsilon);
 RETURN  $1 + laplaceDistribution;

 END;
 $$ LANGUAGE plpgsql;

CREATE AGGREGATE SUM_LAPLACE(real)
(
SFUNC = calculateSum,
STYPE = real,
FINALFUNC = addLaplacianNoiseSum
);

函数 searchmaximumvalue($1,$2) 工作正常。 我想从第一个函数返回 sum 和 max_v 并将它们传递给下面的第二个函数。 我该怎么做?

【问题讨论】:

  • 不相关,但我相信calculateSum中的IF/ELSIF块可以简化为:SELECT coalesce($1, 0) + coalesce($2, 0);

标签: sql postgresql plpgsql postgresql-9.1


【解决方案1】:

demo:db<>fiddle

您可以创建自己的返回类型:

CREATE TYPE my_type AS (sum real, max_v real);

这可以在SFUNC内使用:

CREATE OR REPLACE FUNCTION calculateSum(my_type, real) RETURNS my_type  -- returns my_type
AS $$
DECLARE 
   sumValue real := 0;
   max_v real;
   output my_type; -- new variable of my_type
BEGIN
   /* A LOT OF CODE HERE */

   output.sum := sumValue;
   output.max_v := max_v;

   RETURN output;
END;
$$ LANGUAGE plpgsql;

当然也可以作为FINALFUNC 的输入:

CREATE OR REPLACE FUNCTION addLaplacianNoiseSum(my_type) RETURNS real AS $$

FINALFUNC中使用它:

$1.max_v
$1.sum

然后你的聚合看起来像

CREATE AGGREGATE SUM_LAPLACE(real) (
    SFUNC = calculateSum,
    STYPE = my_type,         -- return type == my_type
    FINALFUNC = addLaplacianNoiseSum
);

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多