Видать, очень надо, раз столько попыток. Ну что ж, давай разбираться.
 SELECT COALESCE(max(oo.Дата), o.Дата)  
FROM Date AS oo  
WHERE oo.Дата < o.Дата 
Этот запрос явно является попыткой вычислить предыдущую дату для текущей записи. Это напомнило мне  
мой собственный ответ  на подобную тему. Перепишу его в терминах этого вопроса.
 SELECT *
FROM ( SELECT Дата,  
              Вода,  
              Смена_ID,  
              ( SELECT Max(Дата)  
                FROM Date AS t2  
                WHERE t2.Дата < t1.Дата 
              ) AS Дата_пред  
       FROM Date AS t1 
     ) AS Тек LEFT JOIN Date AS Пред ON Тек.Дата_пред = Пред.Дата; 
В отличие от того случая здесь дата не является уникальной, поэтому у нас будет множественное дублирование. Как его избежать? Ответ на этот вопрос зависит уже от предметной области. Можно добавить условие совпадения смены:
 SELECT * 
FROM ( SELECT Дата,   
              Вода,   
              Смена_ID,   
              ( SELECT Max(Дата)   
                FROM Date AS t2   
                WHERE t2.Дата < t1.Дата AND t2.Смена_ID = t1.Смена_ID  
              ) AS Дата_пред   
       FROM Date AS t1  
     ) AS Тек LEFT JOIN Date AS Пред ON Тек.Дата_пред = Пред.Дата AND Тек.Смена_ID = Пред.Смена_ID; 
Но без знания того, какие данные имеются и что из них должно получиться, дальше двигаться сложно.