0

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

mysql> 从表中选择日期,其中 dayofweek(date) = 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 |
+------------+

提前致谢。

4

1 回答 1

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

希望这可以帮助

于 2013-03-31T06:30:31.827 回答