如何让列自动计算?导轨
Posted
技术标签:
【中文标题】如何让列自动计算?导轨【英文标题】:How can I have a column autocalculate itself? Rails 【发布时间】:2013-03-28 03:03:14 【问题描述】:我的表格中有每日股票价格,并且我添加了一个我想自动计算的列。我不希望它是手动计算,因为股票价格是我通过金融 api 导入模型的东西。
因此我只是使用ActiveRecord-import
,然后自动填充该列。
有问题的列是百分比变化和过去 5 天的平均值。我觉得这是我可以在数据库端设置的东西,以便自动填充这些列。几乎就像 Excel 能够只写 =a1/b1
然后填充整个表格。
这在 Rails 模型或 postgresql 中是否可行? (使用 rails 3.2 和 postgresql 9.2)
【问题讨论】:
【参考方案1】:还有一个更接近您的想法的选项:“计算字段”或“生成的列”。实际上是一个以行类型为参数的函数。我引用the manual here:
函数记法和属性记法的等价性 可以在复合类型上使用函数来模拟“计算字段”
您的示例可能如下所示:
CREATE TABLE tbl (a_id int, a int, b int);
INSERT INTO tbl VALUES (1,3,7), (2,4,8), (3,9,2);
模拟计算域calc
的函数:
CREATE OR REPLACE FUNCTION calc(tbl)
RETURNS numeric LANGUAGE sql IMMUTABLE AS
$func$
SELECT round($1.a::numeric/$1.b, 2)
$func$;
呼叫:
SELECT *, t.calc FROM tbl t; -- note the table-qualified call!
返回:
a_id | a | b | calc
------+---+---+------
1 | 3 | 7 | 0.43
2 | 4 | 8 | 0.50
3 | 9 | 2 | 4.50
更多详细信息和解释的相关答案:Computed / calculated columns in PostgreSQLHow do you do date math that ignores the year?Store common query as column?
【讨论】:
我注意到你写了一个关于表的函数。每当我使用select t.calc
时都会执行该功能吗?还是该函数已经执行并且现在正在存储一个值?我问是因为性能原因。如果每次我使用select *,t.calc
时它都会运行该函数,那么我最好使用触发器并第一次将值插入列中,从而节省我随后每次处理计算所需的时间。你知道它是在select
上存储值还是计算?
@ErwinBrandstter 我还有另一个问题...您的公式能够计算每一行,我将如何计算多行?例如,在您的表格中,我需要一些东西来显示 b 列中的增加/减少。 'calc' 列将是 7/8-1 = -.125 或 8/2-1 = 3。这些是我在 calc
列中需要的值,第三列显示为 nil。
@Chowza:我会用窗口函数lag()
解决这个问题,就像今天演示的in this related answer:底部的“正确解决方案”段落。【参考方案2】:
我知道DB
端有 2 个选项,您可以尝试使用 view
,其中包含获取动态字段的逻辑,或者您可以使用 trigger
在任何位置自动填充它们表变化
更新: *触发器* 只不过是当您对表执行任何更新(插入/更新/删除)时自动触发的函数,这里有更多信息:http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html
Views 是给定 sql 查询的伪名称,您可以将逻辑编写为
create view test as select 1+1 as dynamic_col
然后将其用作
select * from test;
在上述情况下输出应为2,但可以根据您的要求自定义视图
这里有更多信息:http://www.postgresql.org/docs/9.2/static/sql-createview.html
【讨论】:
我还是个使用数据库的新手。触发器是我在 Rails 迁移中设置的吗?我有 pgadmin 3,我可以查看文档以了解如何编写该语句,但是当我将应用程序推送到我们的开发基地时,我的朋友在他的计算机上是否能够看到我的 postgresql 更改? rails 中记录的数据库代码在哪里?或者这是我在 ACtiveRecord::Base.connection 中写的东西以上是关于如何让列自动计算?导轨的主要内容,如果未能解决你的问题,请参考以下文章