У меня есть таблицы, которые записывают, когда определенные элементы были отправлены или возвращены в определенное место, и я хочу определить интервалы между каждым возвратом определенного элемента.
Образец данных:
Item ReturnDate:
Item1, 20120101
Item1, 20120201
Item1, 20120301
Item2, 20120401
Item2, 20120601
Таким образом, в этом случае мы видим, что был месячный перерыв до того, как элемент 1 был возвращен в первый раз, и еще месяц до того, как он был возвращен во второй раз. Пункт 2 вернулся через 2 месяца.
Моя отправная точка:
Select r1.Item, r1.ReturnDate, r2.Item, r2.ReturnDate, DateDiff(m, r1.ReturnDate, r2.ReturnDate)
from Returns r1
inner join Returns r2 on r2.VehicleNo = r1.VehicleNo
Однако в этом образце каждый элемент сравнивается с каждым другим экземпляром, в котором он был возвращен, а не только со следующим. Поэтому мне нужно ограничить этот запрос, чтобы он сравнивал только соседние результаты.
Одним из решений является пометка каждого возврата счетчиком (сколько раз этот элемент был возвращен):
Item ReturnDate, ReturnNo:
Item1, 20120101, 1
Item1, 20120201, 2
Item1, 20120301, 3
Item2, 20120401, 1
Item2, 20120601, 2
Это позволило бы мне использовать следующий T-SQL (или аналогичный):
Select r1.Item, r1.ReturnDate, r2.Item, r2.ReturnDate, DateDiff(m, r1.ReturnDate, r2.ReturnDate)
from Returns r1
inner join Returns r2 on r2.VehicleNo = r1.VehicleNo
and (r1.ReturnNo + 1 = r2.ReturnNo)
Мой первый вопрос заключается в том, является ли это разумным/оптимальным подходом или есть ли лучший подход?
Во-вторых, каков самый простой/самый удобный способ расчета ReturnNo?