我正在查询PostgreSQL 9.4数据库,我想使用同一查询中的列执行计算。
我尝试获取的结果是基于total_days金额中超出的天数的部分值。例如。
开始日期:2016年1月1日,
duration_in_months:2
total_days:60,
值x:120。
如果我今天(2016年5月1日)启动查询,则要获取:
partial_result = value_x * passed_days / total_days
120 * 5 / 60
在我的数据集中,我有超过10万条记录,我需要按月分组此部分值(按月添加部分值)。
================================================== =======================
在MySQL中,我可以进行如下计算:
SELECT
start_date,
duration_in_months,
@end_date:= DATE_ADD(start_date, INTERVAL duration_in_months MONTH) as end_date,
@total_days:= DATEDIFF(@end_date, start_date),
@passed_days:= DATEDIFF(CURDATE(), start_date),
value_x,
(value_x * @passed_days / @total_days) as partial_result
FROM table;
按照此question previously asked中的说明,我目前在PostgreSQL中使用类似以下的查询:
SELECT
start_date,
duration_in_months,
end_date,
total_days,
value_x,
(value_x * passed_days / total_days) as partial_result
FROM (SELECT *,
(start_date + (duration_in_months || ' month')::INTERVAL) as end_date,
EXTRACT(DAY FROM (start_date + (duration_in_months || ' month')::INTERVAL) - start_date) as total_days,
EXTRACT(DAY FROM current_date - start_date) as passed_days
FROM table) as table1;
我需要您的帮助,以便:
在PostgreSQL中使用计算的变量(例如在MySQL中使用查询中的公式),或找到另一种使查询更具可读性的方法
按月将部分结果分组
插入where子句以确保
经过的天数> = 0,通过的天数
预先非常感谢您,随时询问更多细节。
最佳答案
首先,不能保证您的MySQL查询正常工作。 MySQL文档非常明确,SELECT
中表达式的求值顺序可以是任意的。因此,可以在设置变量之前评估最后一个表达式(实际上,它们将被设置为上一行中的值)。
在Postgres中,我认为您对子查询或CTE有正确的想法。您只引用没有@
的列。我不知道特定的日期算术是否正确,但这是等效的查询:
SELECT start_date, duration_in_months, end_date, total_days, value_x,
(value_x * passed_days / total_days) as partial_result
FROM (SELECT t.*,
(start_date + (duration_in_months || ' month')::INTERVAL) as end_date,
EXTRACT(DAY FROM (start_date + (duration_in_months || ' month')::INTERVAL) - start_date) as total_days,
EXTRACT(DAY FROM current_date - start_date) as passed_days
FROM table t
) t;
extract(day)
在我看来错了,但是您是从interval
而不是日期/时间表达式中提取日期。我认为它可以满足您的需求。