将具有特定日期的不常值的表转换为包含句点中所有日期的表

时间:2011-12-09 13:14:30

标签: mysql sql

我得到了以下MySQL表,将值存储到特定日期:

| date       | value |
======================
| 2009-03-29 | 0.5   |
| 2010-01-30 | 0.55  |
| 2011-08-12 | 0.67  |

现在我需要另一个表格,将这些值映射到表格中第一个和最后一个日期范围内的每一天(填补空白)。所以最后看起来应该是这样的:

| date       | value |
======================
| 2009-03-29 | 0.5   |
| 2009-03-30 | 0.5   |
| 2009-04-01 | 0.5   |
| ...        | ...   |
| 2010-01-30 | 0.55  |
| 2010-02-01 | 0.55  |
| 2010-02-02 | 0.55  |
| ...        | ...   |
| 2011-08-10 | 0.55  |
| 2011-08-11 | 0.55  |
| 2011-08-12 | 0.67  |

有没有办法在SQL查询中解决这个问题?

1 个答案:

答案 0 :(得分:1)

从另一个案例来看,你似乎正在做的是在一段时间内显示价值趋势,即使每天都没有提供价值......所以,你可能从10月1日开始, 2011年至2011年12月1日(或该事项的任何其他日期范围)。

您可以使用mysql变量并加入ANY表(我有“AnyOtherTableInYourDatabase”)至少具有您想要回顾的天数,从而轻松地模拟整个日期范围。在仅仅是日期的示例中,我从当前日期开始,然后跑回说... 60天。您也可以使用其他内容更改“开始日期”,并根据需要返回/转发。

select  JustDates.OneDate
    from 
        ( SELECT 
                 @r:= date_add(@r, interval 1 day ) OneDate
            FROM 
                 (select @r := current_date()) vars,
                AnyOtherTableInYourDatabase limit 30 ) JustDates

现在,要获得最新的“阅读”,请通过select / from添加到列。然后,将该结果集重新连接到原始读数表以获得有问题的值

select
      PreQuery.OneDate,
      PreQuery.LatestReading,
      Y2.Value
   from 
      ( select  JustDates.OneDate,
                ( select max( YRT.Date )
                     from YourReadingsTable YRT
                     where YRT.Date <= JustDates.OneDate ) as LatestReading
           from 
              (SELECT @r:= date_add(@r, interval 1 day ) OneDate
                  FROM (select @r := current_date()) vars,
                       AnyOtherTableInYourDatabase limit 30 ) JustDates ) PreQuery
      JOIN YourReadingsTable Y2
         on PreQuery.LatestReading = Y2.Date