MySQL累计前6个月总和

时间:2017-08-31 15:05:26

标签: mysql sql aggregate cumulative-sum

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

我需要通过Wellname和date聚合数据。我希望每个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 

如您所见,由于没有6个月的生产数据,因此“A0002”井的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)

1 个答案:

答案 0 :(得分:0)

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;
相关问题