为什么pg_trigger_depth() = 0
在防止触发器级联(递归)时使用(除调试之外的)不好?
有人可以提供代码来证明它为什么不好吗?
我猜测是因为如果多个触发器同时处理相同的数据,则停止使用触发器的条件pg_trigger_depth() = 0
将停止任何排在第二位的触发器。
我认为这将是解决这个(我的)问题的好方法,但有人告诉我:
认为这会是一个很好的问题。
它在此处作为解决方案提供:
Postgres 9.3 文档:
https://www.postgresql.org/docs/9.3/static/functions-info.html
我想生成给定日期的通用季度结束日期。
例如:如果我有2010-01-01
,我想返回2010-03-31
,等等。
我可以得到季度号和年份:
select to_char(date_trunc('quarter', current_date)::date, 'yyyy-q');
Run Code Online (Sandbox Code Playgroud)
2017-3
从今天起返回的是2017-07-14
我如何很好地获得季度结束日期?
我可以得到答案,但它非常丑陋:
select to_char(date_trunc('year', date '2015-01-01'),'yyyy') || '-' ||case
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 1 then '03-31'
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 2 then '06-30'
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 3 then '09-30'
when (select extract('quarter' from date_trunc('quarter', date '2015-01-01')::date )) = 4 then '12-31'
else '?'
end
Run Code Online (Sandbox Code Playgroud)
返回2015-03-31
因为我把2015-01-01
。
有没有更好的办法?
我的公司正在启动一项旨在从头开始构建财务数据库的新计划。
我们将通过以下方式使用它:
数据的大致范围:
周期:每日、每月、每季度、每年
20 年的回顾会随着时间的推移而增长
问题:在我们的 PostgreSQL 数据库中,我们应该使用什么模式?现在我正在考虑每个公司的一个时间序列表,完全规范化数据库的每个数据字段类别。例如,一个表用于 IBM 的所有资产负债表字段,另一个表用于 IBM 的现金流项目等,用于所有类别的数据和每个公司。时间戳作为记录和数据字段作为列/字段。然后对于快速查询,创建一个仓库和视图等,它们没有完全规范化,但针对我上面列出的用例的查询进行了优化。但是,如果您查看我上面的公司和领域的数量,如果我的表格很宽,我可能会得到超过 200,000 个表格,仅用于我的基本财务数据,这也不是很好。这是很多表,但我没有看到另一种好的方法来做到这一点。
如果有更好的地方问这个问题,请告诉我。
如果您需要更多信息,我很乐意编辑我的问题并添加它。
PS - 我在 SO Quant 网站上问了一个类似的问题,但没有得到太多的架构帮助。此外,非模式集中的答案是可以的,但请注意,我正在寻求模式设计方面的帮助。
我希望加快单个表上的一些计算。
这是表,我相信它有超过 9300 万行,并且每天都在增长:
CREATE TABLE daily_data
(
id serial NOT NULL,
company_id integer NOT NULL,
trade_date date NOT NULL,
daily_val numeric NOT NULL,
bbg_pulls_id integer,
gen_qtr_end_dt_id integer,
ern_release_date_id integer,
wh_calc_id integer,
CONSTRAINT daily_data_pkey PRIMARY KEY (id),
CONSTRAINT daily_data_bbg_pulls_id_fkey FOREIGN KEY (bbg_pulls_id)
REFERENCES bbg_pulls (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT daily_data_company_id_fkey FOREIGN KEY (company_id)
REFERENCES company (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT daily_data_ern_release_date_id_fkey FOREIGN KEY (ern_release_date_id)
REFERENCES ern_dt …
Run Code Online (Sandbox Code Playgroud) postgresql performance postgresql-9.3 postgresql-performance
我希望将一个表中的日期与另一个表中具有不同频率的日期对齐。我希望与低频表相关联的值在出现新日期之前重复,以便我可以对涉及两个表的数据进行计算。
为了促进这一点,我认为构建索引范围方案会很有用且更快。
这可能会更清楚...
让我们称之为daily
表:
CREATE TEMP TABLE daily AS
SELECT date::date, val FROM ( VALUES
('2017-01-01',1),
('2017-01-02',2),
('2017-01-03',1),
('2017-01-04',56),
('2017-01-05',7),
('2017-01-06',6),
('2017-01-07',8),
('2017-01-08',6),
('2017-01-09',4),
('2017-01-10',4),
('2017-01-11',6),
('2017-01-12',8)
) AS t(date,val);
Run Code Online (Sandbox Code Playgroud)
这是low_fq
(低频)表:
CREATE TEMP TABLE lowfq AS
SELECT date::date, val FROM ( VALUES
( '2017-01-02',700 ),
( '2017-01-06',100 ),
( '2017-01-08',200 ),
( '2017-01-12',500 )
) AS t(date,val);
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的:
?????????????????????????????????????????????????????????????
? dialy ? ? ? low_fq ? ? ? low_fg/daily ?
?????????????????????????????????????????????????????????????
? date ? val ? …
Run Code Online (Sandbox Code Playgroud) postgresql ×4
timestamp ×2
date ×1
functions ×1
interval ×1
performance ×1
schema ×1
trigger ×1