2013-03-29 3 views
0

У меня есть таблица с столбцом даты и значения. Таблица заполняется ежедневно новыми значениями. Порой население не имеет места. Мне нужно создать отчет о последних значениях в каждый прошлый понедельник. Этот запрос показывает, что данные не были собраны в 2013-02-18 годах.Запрос Mysql для последнего значения, когда дата отсутствует

mysql> выберите дату из таблицы, где dayfweek (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) 

Поэтому я хотел бы получить последнее предыдущее значение для этого понедельника. Я могу сделать это с < = макс (дата) отдельно, если я знаю, что недостающую дату, как это:

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 | 
+------------+ 

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

ответ

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

Надеется, что это помогает

+0

Спасибо за помощь. Но я не получил достаточной информации. Поскольку этот запрос возвращает 4858 строк. Данные обычно вводятся в таблицу ежедневно для нескольких именованных объектов. Вот ваш запрос для моей среды: – user2225048

+0

mysql> SELECT date FROM temp t WHERE array like "arrayname" и dayofweek (date) = 2 ИЛИ EXISTS (SELECT max (DATE) FROM temp i WHERE array like "arranyname" и WEEK (t. дата) = НЕДЕЛЯ (i.date) И НЕ СУЩЕСТВУЕТ (SELECT 1 FROM temp WHERE array, как «arrayname» и WEEK (дата) = CASE КОГДА НЕДЕЛЯ (i.date) = 53 ТОГДА 0 ELSE WEEK (i.date) + 1 END = НЕДЕЛЯ (дата) И ГОД (дата) = ГОД (i.date) + CASE КОГДА НЕДЕЛЯ (i.date) = 53 ТОГДА 1 ELSE 0 END И dayfweek (дата) = 2)); – user2225048

+0

Если вы не предоставляете полную информацию, мы не можем вам помочь – Akash

 Смежные вопросы

  • Нет связанных вопросов^_^