Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql数据库中分母最小公倍数的计算_Sql_Postgresql_Greatest Common Divisor_Lcm - Fatal编程技术网

Postgresql数据库中分母最小公倍数的计算

Postgresql数据库中分母最小公倍数的计算,sql,postgresql,greatest-common-divisor,lcm,Sql,Postgresql,Greatest Common Divisor,Lcm,我想创建一个表格来更好地说明我的问题 这是我在postgresql数据库中的数据示例 我想做的工作是循序渐进的,如下所示 1-按组id列对分母列中的值进行分组,并计算最小公倍数。 为此操作,我创建了lcm(最小公倍数)和gcd(最大公因数)函数。 加在这里 2-按分母列的值成比例增加分子值。数学公式如下: (lcm(values of denominator(1..to -n)) / values of denominator ) * values of the numerator 3-通

我想创建一个表格来更好地说明我的问题

这是我在postgresql数据库中的数据示例

我想做的工作是循序渐进的,如下所示

1-按组id列对分母列中的值进行分组,并计算最小公倍数。 为此操作,我创建了lcm(最小公倍数)和gcd(最大公因数)函数。 加在这里

2-按分母列的值成比例增加分子值。数学公式如下:

(lcm(values of denominator(1..to -n)) / values of denominator ) * values of the numerator
3-通过按组id值分组,对新计算值求和

所有的项目,如sql,函数,视图,将使这项工作完成适合我

我能为此做些什么


我用了这样的方法来解决这种情况。这可能不是最好的解决方案,但它满足了我的需要

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$

使用而不是重新发明轮子怎么样?我把你的标签plsql改成了psql。Plsql是Oracle专有的。@非常感谢您的建议,但由于所有者问题,我无法创建扩展。我没有PostgreSQL的所有者。@保护者谢谢你。
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$