SQL

SQL Запрос. Дублируются данные

Должно быть вот такА выглядит так
Как исправить?

use mydb;
select distinct o.Дата, p.Дата, o.Смена_ID, p.Смена_ID, (select -p.Вода-(-o.Вода) where p.Дата = (select coalesce(max(oo.Дата), o.Дата)
from Date as oo where oo.Дата < o.Дата)) as Вода from Date as p, Date as o group by o.Дата, p.Дата order by p.Вода asc
Видать, очень надо, раз столько попыток. Ну что ж, давай разбираться.
 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;

Но без знания того, какие данные имеются и что из них должно получиться, дальше двигаться сложно.
Кирилл Компаниец
Кирилл Компаниец
12 091
Лучший ответ
Так вы свой скрипт посмотрите. Вы сделали реализацию "каждый с каждым", только в старом стиле from Date as p, Date as o. Вы таблицу Date перемножили саму на себя.
AB
Arsen Bolat
20 187