Database design 计算两列之间的百分比变化

Database design 计算两列之间的百分比变化,database-design,percentage,postgresql,Database Design,Percentage,Postgresql,我有一个表,它有两列,列出了每个产品版本中特定项目的数量。我需要计算两列之间的百分比增长,并将其附加到表中的一个新列,但是我没有找到任何与此相关的文档?我使用的是Postgres 9.0,我需要检查两列之间的百分比增加,作为质量控制过程的一部分,以确保版本之间没有丢失/错误的数据 以下是表格定义: oid oid[] NOT NULL, "State" character varying(2)[] NOT NULL, release_1121 numeric NOT NULL, release_

我有一个表,它有两列,列出了每个产品版本中特定项目的数量。我需要计算两列之间的百分比增长,并将其附加到表中的一个新列,但是我没有找到任何与此相关的文档?我使用的是Postgres 9.0,我需要检查两列之间的百分比增加,作为质量控制过程的一部分,以确保版本之间没有丢失/错误的数据

以下是表格定义:

oid oid[] NOT NULL,
"State" character varying(2)[] NOT NULL,
release_1121 numeric NOT NULL,
release_1122 numeric NOT NULL,
CONSTRAINT oid PRIMARY KEY (oid)

我想添加一个百分比增加列,并用正确的百分比填充它。

我想说,添加百分比增加列是一次性操作,可以这样做():

然后可以更新该表,并用新值填充它:

UPDATE target SET pct = (after::float - before::float) / before::float;

我想说,添加百分比增加列是一次性操作,可以这样做():

然后可以更新该表,并用新值填充它:

UPDATE target SET pct = (after::float - before::float) / before::float;
我认为这是你真正需要的:

表应该如下所示:

CREATE TABLE release (
release_id integer PRIMARY KEY,    -- pk is NOT NULL automatically
-- state varchar(2)[] NOT NULL,    -- ??
amount numeric NOT NULL
);
测试数据:

INSERT INTO release VALUES (release_id, amount)
  (1121, 25)
, (1122, 30)
, (1123, 90)
, (1124, 10);
查询:

WITH x AS (
    SELECT *
         , lag(amount) OVER (ORDER BY release_id) as last_amount
    FROM   release
    )
SELECT release_id, amount
     , (amount - last_amount) AS abs_change
     , round((100 * (amount - last_amount)) / last_amount, 2) AS percent_change
FROM   x
ORDER  BY release_id;
和窗口功能需要PostgreSQL 8.4或更高版本。
结果:

release|u id | amount | abs|u change | percent|u change
-----------+--------+------------+---------------
1121       | 25     |      | 
1122       | 30     | 5          |  20.00
1123       | 90     | 60         | 200.00
1124       | 10     | -80        | -88.89
  • 不要将
    oid
    用作主键!这是个坏习惯。在PostgreSQL 9.0中是默认值

  • 如果可以避免的话,不要使用like
    “State”
    。见:

    • 我认为这是您真正需要的:

      表应该如下所示:

      CREATE TABLE release (
      release_id integer PRIMARY KEY,    -- pk is NOT NULL automatically
      -- state varchar(2)[] NOT NULL,    -- ??
      amount numeric NOT NULL
      );
      
      测试数据:

      INSERT INTO release VALUES (release_id, amount)
        (1121, 25)
      , (1122, 30)
      , (1123, 90)
      , (1124, 10);
      
      查询:

      WITH x AS (
          SELECT *
               , lag(amount) OVER (ORDER BY release_id) as last_amount
          FROM   release
          )
      SELECT release_id, amount
           , (amount - last_amount) AS abs_change
           , round((100 * (amount - last_amount)) / last_amount, 2) AS percent_change
      FROM   x
      ORDER  BY release_id;
      
      和窗口功能需要PostgreSQL 8.4或更高版本。
      结果:

      release|u id | amount | abs|u change | percent|u change
      -----------+--------+------------+---------------
      1121       | 25     |      | 
      1122       | 30     | 5          |  20.00
      1123       | 90     | 60         | 200.00
      1124       | 10     | -80        | -88.89
      
      • 不要将
        oid
        用作主键!这是个坏习惯。在PostgreSQL 9.0中是默认值

      • 如果可以避免的话,不要使用like
        “State”
        。见:


      11211122-这些是字段名称还是值?请在此发布完整的表定义。并向我们展示您迄今为止所做的工作。似乎应该有一个
      release
      表,其中每个版本有一个金额,并且有一个视图/函数计算所有/选定版本之间的更改。不是用于发布之间的增量的表。此外,请提及您的Postgres版本和计算的预期目的(以便更好地理解您的需要)。1121122-这些是字段名称还是值?请在此发布完整的表定义。并向我们展示您迄今为止所做的工作。似乎应该有一个
      release
      表,其中每个版本有一个金额,并且有一个视图/函数计算所有/选定版本之间的更改。不是用于发布之间的增量的表。另外,请提及你的博士后版本和计算的预期目的(以便更好地理解你需要什么)。这正是我在得到你的答案之前所想的建议!没有多余的金额存储,因此如果发现一个金额不正确,您修复该金额,您就完成了;无需查找冗余副本或重新计算依赖值。@kgrittn:同样的想法,可能是因为这是避免冗余存储的明显途径。:)这正是我在得到你的答案之前想提出的建议!没有多余的金额存储,因此如果发现一个金额不正确,您修复该金额,您就完成了;无需查找冗余副本或重新计算依赖值。@kgrittn:同样的想法,可能是因为这是避免冗余存储的明显途径。:)