【问题标题】:MySQL cumulative first 6 month sumMySQL 前 6 个月累计总和
【发布时间】:2017-08-31 15:05:25
【问题描述】:

我有一个 SQL 问题(MySQL)。如何从下表创建一个新表(表名:“well_master_prod_inj”)。

我需要按 Wellname 和日期汇总数据。我希望每个井名只有一行数据,并且列显示以下数据:

一列显示给定的第一个 OilRate 日期。

一列显示给定的第一个 OilRate。

一栏显示前 6 个月的累计油费总和。

当前数据表:

well_master_prod_inj:
    WellName    Date    OilRate FieldName
    A0001   12/1/2001   7000.6  Test
    A0001   1/1/2002    2237.6  Test
    A0001   2/1/2002    1518.61 Test
    A0001   3/1/2002    2518.61 Test
    A0001   4/1/2002    1040.98 Test
    A0001   5/1/2002    2030.98 Test
    A0001   6/1/2002    1090.98 Test
    A0001   7/1/2002    2040.98 Test
    A0002   12/1/2002   5000.97 Test
    A0002   1/1/2003    2103.97 Test
    A0002   2/1/2003    1275.94 Test
    A0002   3/1/2003    1875.94 Test
    A0002   4/1/2003    1232.34 Test

充满希望的新表:

prod_inj_agg:
WellName    StartDate   StartOilRate    6M_CumOilRate
A0001      12/1/2001        7000.6         16347.38
A0002      12/1/2002        5000.97 

如您所见,“A0002”井的6个月累计产油率有一个空白,因为没有6个月的生产数据。如果没有足够的生产数据,我想留空。

有人可以帮我解决这个 mySQL 问题吗?

这是我的 Insert into SQL 语句。 (很抱歉一开始没有添加它)这目前只是从原始表中添加列,我还没有尝试任何聚合。

INSERT INTO sdx.prod_inj_agg
               (SELECT
                WellName,
                `Date` as StartDate,
                OilRate as StartOilRate,
                OilRate as '6M_CumOilRate'
                FROM
                sdx.well_master_prod_inj)

【问题讨论】:

  • 请为我们提供表ProductionData的CREATE表语句和INSERT语句
  • 很抱歉。我添加了一个插入语句。它目前只是从原始表中插入列。我还没有尝试聚合。
  • 所以,如果 A0001 将有另外 8/1/2002、9/1/2002、10/1/2002 和 11/1/2002 记录,那么在结果可以总结出另外 6 个月的 OilRate?
  • 不,只是前 6 个月的石油产量。

标签: mysql sql aggregate cumulative-sum


【解决方案1】:
CREATE TABLE IF NOT EXISTS well_master_prod_inj_rank AS (
    SELECT a.WellName, a.`Date`, a.OilRate, count(b.`Date`)+1 as Rank
    FROM well_master_prod_inj a
    LEFT JOIN well_master_prod_inj b on a.WellName = b.WellName and a.`Date` > b.`Date`
    group BY a.WellName, a.`Date`, a.OilRate
    order by a.WellName, a.`Date`
) ;

INSERT INTO sdx.prod_inj_agg
select r2.WellName, r1.Date as StartDate, r1.OilRate as StartOilRate, r2.`6M_CumOilRate`
from (
    select WellName, round(sum(OilRate),2) as `6M_CumOilRate`
    from well_master_prod_inj_rank 
    where rank <=6 
    group by WellName
) r2 join (
    select * from well_master_prod_inj_rank where rank = 1
) r1 on r2.WellName = r1.WellName;

【讨论】:

  • 谢谢!目前排名表没有以正确的顺序创建排名,一口井的排名是 1,5,9 等,不知道为什么。但这应该让我开始。
  • 检查您的Date 列。该字段的数据类型是什么?
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2016-11-04
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多