我正在查询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而不是日期/时间表达式中提取日期。我认为它可以满足您的需求。

09-26 17:41
查看更多