当缺少日期时,Mysql查询最新值

时间:2013-03-29 17:13:35

标签: mysql dayofweek missing-data maxdate

我有一个包含日期和值列的表。该表每天都会填充新值。有时人口不会发生。我需要在每个星期一生成一份最新值的报告。此查询显示2013-02-18未收集任何数据。

的MySQL>从表格中选择日期,其中dayofweek(日期)= 2;

+------------+
| date       |
+------------+ 
| 2013-02-04 | 
| 2013-02-11 | 
| 2013-02-25 | 
| 2013-03-04 | 
| 2013-03-11 | 
| 2013-03-18 | 
| 2013-03-25 | 
+------------+ 
7 rows in set (0.00 sec)

所以我想获得该星期一的最新值。如果我知道这样的遗漏日期,我可以单独使用< = max(date):

mysql> select max(date) from table where date <= "2013-02-18"; 
+------------+ 
| max(date) | 
+------------+ 
| 2013-02-14 | 
+------------+
1 row in set (0.00)

这表明2013-02-18的最新值是在2013-02-14收集的。所以我需要一个单独的查询来返回每个星期一的最新值。如果当天没有值,请使用最新的先前现有值。我的输出应该如下所示:

+------------+
| date       |
+------------|
| 2013-02-04 |
| 2013-02-11 |
| 2013-02-14 |
| 2013-02-25 |
| 2013-03-04 |
| 2013-03-11 |
| 2013-03-18 |
| 2013-03-25 |
+------------+

提前致谢。

1 个答案:

答案 0 :(得分:0)

试试这个

SELECT 
    date 
FROM
    temp t
WHERE
    dayofweek(date) = 2 OR EXISTS   (
                                        SELECT 
                                            max( DATE )
                                        FROM    
                                            temp i
                                        WHERE
                                            WEEK( t.date ) = WEEK( i.date )
                                            AND NOT EXISTS ( SELECT 1 FROM temp WHERE WEEK( date ) = CASE WHEN WEEK( i.date ) = 53 THEN 0 ELSE WEEK( i.date ) + 1 END = WEEK( date ) AND YEAR( date ) = YEAR( i.date ) + CASE WHEN WEEK( i.date ) = 53 THEN 1 ELSE 0 END AND dayofweek(date) = 2 )
                                    )

查询的工作方式为

显示当前行if its dayofweek = 2 OR if there are no records of dayofweek = 2 in the next week and the current date is maximum for the current week

我还处理了year条件

week()次更改

这是SQLFiddle

希望这有帮助