Внутренние объединения SQL: последний случай жадного совпадения - PullRequest
1 голос
/ 11 февраля 2012

Я в тупике. У меня есть таблица, которая содержит информацию о поездках за последние несколько лет для людей в моей организации. Наша цель - определить время между каждой конкретной поездкой, в которой человек находился дома «DwellAC». Поездки, возможно, не были введены в порядке. Я знаю, что мне нужно сузить поездки и выбрать самую последнюю поездку до текущей поездки линий, а затем вычесть даты. Я пытаюсь использовать самостоятельное соединение, потому что все данные находятся только в одной таблице. Это моя попытка использовать SQL для расчета задержки для каждой поездки.

UPDATE Deployments AS d1 
INNER JOIN Deployments AS d2 
ON d1.AC=d2.AC or d1.AC=d2.FP 
SET d1.DwellAC = d1.DepartMcGuire-d2.ReturnMcGuire
WHERE d2.ReturnMcGuire<d1.DepartMcGuire And d1.AC<>'' And d1.ID<>d2.ID;

Я думал, что код работает нормально. Казалось, все правильно рассчитал. Я начал сталкиваться с проблемами, когда новые поездки были добавлены в прошлом. Это означает, что мы нашли новые данные для ввода старой поездки. Индекс на новых старых поездках выше и, кажется, отбрасывает вещи.

Сегодня утром я понял, что мне, очевидно, нужно включить больше данных. Стол выглядит так.

AC    DwellAC DepartMcGuire ReturnMcGuire
Evan          1/1/2011      2/1/2011
Evan          3/10/2011     4/10/2011
Evan          1/1/2010      6/1/2010

Цель состоит в том, чтобы правильно заполнить столбец DwellAC домашним временем между поездками.

Можно ли как-нибудь использовать вложенный запрос where, чтобы найти максимальную дату <дату следующего отправления для использования в запросе на обновление? </p>

Я знаю, что псевдокод будет выглядеть так

For each AC
Select all trips where oldtrip.returnMcGuire < thistrip.departMcGuire and AC=AC
From these trips select MAX oldtrip.ReturnMcGuire
Update this.DwellAC = maxfound oldtrip.returnMcguire - thistrip.departMcGuire

Спасибо за любую помощь, я не уверен, что мне вообще нужно внутреннее соединение

Я нашел этот запрос

SELECT CurrentTrip.AC, CurrentTrip.DwellAC, CurrentTrip.FP, CurrentTrip.DepartMcGuire,    
(SELECT MAX(LastTrip.ReturnMcGuire)
 FROM Deployments AS LastTrip
 WHERE ((CurrentTrip.AC=LastTrip.AC OR CurrentTrip.AC=LastTrip.FP) AND (LastTrip.ReturnMcGuire<CurrentTrip.DepartMcGuire))) AS LastReturnMcGuire
 FROM Deployments AS CurrentTrip

Дает мне необходимые мне данные в виде CurrentTrip.DepartMcGuire-LastReturnMcGuire Мне просто нужно превратить его в оператор обновления.

Возможно, что-то вроде этого? который не работает в

UPDATE Deployments AS CurrentTrip
SET CurrentTrip.DwellAC = CurrentTrip.DepartMcGuire-(SELECT MAX(LastTrip.ReturnMcGuire) FROM Deployments AS LastTrip WHERE CurrentTrip.AC=LastTrip.AC);
...