Postgresql数据库中分母的最小公倍数的计算
Calculation of Least Common Multiple of the Denominator in Postgresql Database
我想创建一个 table 来更好地说明我的问题
这是我在 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() :: bigint, abs() :: 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 / gcd(, ) * ;
$BODY$
IMMUTABLE
STRICT
LANGUAGE SQL;
2-增加分子值与分母列的值成比例。像这样的数学公式:
(lcm(values of denominator(1..to -n)) / values of denominator ) * values of the numerator
3-通过按 group_id 值
分组对新计算值求和
对我来说,sql、函数、视图等所有将使这项工作完整的项目都是 suitable。
我能为此做些什么。
我用了这样的方法来解决这种情况。这可能不是最佳解决方案,但它满足了我的需求。
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$
我想创建一个 table 来更好地说明我的问题
这是我在 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() :: bigint, abs() :: 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 / gcd(, ) * ;
$BODY$
IMMUTABLE
STRICT
LANGUAGE SQL;
2-增加分子值与分母列的值成比例。像这样的数学公式:
(lcm(values of denominator(1..to -n)) / values of denominator ) * values of the numerator
3-通过按 group_id 值
分组对新计算值求和对我来说,sql、函数、视图等所有将使这项工作完整的项目都是 suitable。
我能为此做些什么。
我用了这样的方法来解决这种情况。这可能不是最佳解决方案,但它满足了我的需求。
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$