MySQL:用最后的已知值填补空白

时间:2015-12-10 16:16:33

标签: mysql sql database gaps-and-islands

我有一个表格,其中包含不同报告日期的全球销售数据,如下所示:

    event_id   | date          | sales_on_date
    -----------+---------------+----------
    1          | 2015-01-01    | 1000
    1          | 2015-02-01    | 1500
    1          | 2015-03-01    | 1600
    2          | 2015-01-01    | 200
    2          | 2015-02-01    | 500
    3          | 2015-01-01    | 100

我需要编写一个SELECT语句来输出每个日期的销售额(或最后的已知销售额),如下所示:

    event_id   | date          | sales_on_date
    -----------+---------------+----------
    1          | 2015-01-01    | 1000
    1          | 2015-02-01    | 1500
    1          | 2015-03-01    | 1600
    2          | 2015-01-01    | 200
    2          | 2015-02-01    | 500
    2          | 2015-03-01    | 500
    3          | 2015-01-01    | 100
    3          | 2015-02-01    | 100
    3          | 2015-03-01    | 100

目前,我必须发出一个SQL请求来从我的表中获取所有数据,然后使用PHP例程填补空白,但它似乎是纯粹的' SQL解决方案将更加方便和优雅。

知道如何在SQL中执行此操作吗?

1 个答案:

答案 0 :(得分:1)

这有点复杂,因为查询有两个部分。第一个是生成所有行。第二个是填写它们。第一个是CROSS JOIN。第二个是相关的子查询:

select e.event_id, d.date,
       (select t.sales_on_date
        from t
        where t.event_id = e.event_id and t.date <= d.date
        order by t.date desc
        limit 1
       ) as sales_on_date
from (select distinct event_id from t) e cross join
     (select distinct date from t) d
order by e.event_id, d.date;