Mysql запрос на последнее значение при отсутствии даты

У меня есть таблица с датой и значением столбца. Таблица ежедневно заполняется новыми значениями. В отдельных случаях население не проходит. Мне нужно генерировать отчет о последних значениях в каждый прошлый понедельник. Этот запрос показывает, что данные не были собраны в 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 |
+------------+

Заранее спасибо.

1 ответ

Попробуй это

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

Надеюсь это поможет

Другие вопросы по тегам