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
Надеюсь это поможет