我想创建一个表格来更好地说明我的问题。
这是postgresql数据库中我的数据示例
我想要做的工作一步一步地进行,如下所示
1-将分母列中的值按group_id列分组,并计算最小公共倍数。为此,我创建了lcm (最小公共倍数)和gcd (最大公共除数)函数。在这里加的。
CREATE OR REPLACE FUNCTION gcd(bigint, bigint) RETURNS bigint AS
$BODY$
WITH RECURSIVE t(a, b) AS (
VALUES (abs($1) :: bigint, abs($2) :: bigint)
UNION ALL
SELECT b, mod(a,b) FROM t
WHERE b > 0
)
SELECT a AS gcd FROM t WHERE b = 0;
$BODY$
IMMUTABLE
STRICT
LANGUAGE SQL;
CREATE OR REPLACE FUNCTION lcm(bigint, bigint)
RETURNS bigint AS
$BODY$
SELECT $1 / gcd($1, $2) * $2;
$BODY$
IMMUTABLE
STRICT
LANGUAGE SQL;
2-按比例增加分子值与分母列的值。这样的数学公式:
(lcm(values of denominator(1..to -n)) / values of denominator ) * values of the numerator
3-通过按group_id值对新的计算值进行分组来求和新的计算值。
所有的项目,如sql,函数,视图将使这项工作完成,是适合我。
我能为这个做些什么。
发布于 2021-01-14 22:18:55
我用了这样的方法来解决这个问题。这可能不是最好的解决办法,但它满足了我的需要。
DO
$do$
DECLARE
arr int[] := '{5,7,11,798,4212}';
i int :=1;
res int ;
begin
res = lcm(arr[i],arr[i+1]);
RAISE NOTICE '%',res;
FOR i IN array_lower(arr,1) .. array_upper(arr, 1)-2
LOOP
i:=i+1;
res := lcm(res,arr[i+1]);
RAISE NOTICE 'lcm(%,%)',res, arr[i+1];
RAISE NOTICE '%',res;
END LOOP;
END
$do$
https://stackoverflow.com/questions/64971917
复制相似问题