Вопрос : Как в запросе обрабатывать данные предыдущей строки?
Ответ: Иногда при составлении запросов необходимо знать данные, содержащиеся в предыдущей строке. Как правило для того, чтобы получить разницу значений колонки между строками.
Создадим таблицу продаж и построим запрос, в котором будут дополнительные колонки, содержащие даты предыдущих продаж, разницу между суммами продаж и количество дней между продажами:
select a.ClientID, a.Date, b.Date, a.Amount,
a.Amount-b.Amount as DeltaAmount, DATEDIFF(d, b.Date, a.Date) as DeltaDate
from #Sales a
left join #Sales b on b.ClientID=a.ClientID
and b.Date=(
select max(Date)
from #Sales
where ClientID=a.ClientID and Date<a.Date
)
GO
Уникальный кластерный индекс создан по клиентам и датам продажи, поэтому для нахождения даты предыдущей продажи создан подзапрос, который и выдает эту дату по текущему клиенту. Далее все просто.
Таким образом, для построения подобных запросов необходимо иметь условие, согласно которому однозначно определяется положение строки в результате запроса. Если такого условия нет, и строки могут меняться местами без изменения сути запроса, то необходимо добавить искусственный столбец с уникальным ключом.
Надеюсь, Вы нашли эту информацию полезной. Вопросы, предложения и пожелания шлите на адрес sql@likor.ru С уважением, Сергей Кошкин.
Архив рассылки смотрите на сайте Рассылки http://sql.softmatics.ru/