Для каждой строки дают уникальный номер строки, используя необходимый порядок. (Поскольку я получаю Идентификатор важнее, чем дата и дата, более важны, чем ранг).
Вставьте итоговую таблицу в себя, используя номера строк, сдвинутые на одну строку (d1.RowNum = d2.RowNum+1
).
Выберите только строки, которые соединены с строками «другого блока» (d1.Id <> d2.Id or d1.Rank <> d2.rank
).
В зависимости от направления перемещения и выбранной таблицы будет выбрана максимальная или минимальная дата.
Не забывайте, что «кромка края» - ряд, который из-за смещения не может быть соединен (вот почему не inner join
и d1.RowNum = 1
состояние используется).
;WITH dataWithRowNums as (
select Id, Rank, Date,
RowNum = ROW_NUMBER() OVER (ORDER BY Id,date,rank)
from YourTable
)
select d1.Id, d1.Rank, d1.Date
from dataWithRowNums d1
left join dataWithRowNums d2
on d1.RowNum = d2.RowNum+1 and (d1.Id <> d2.Id or d1.Rank <> d2.rank)
where not d2.Id is null or d1.RowNum = 1
Этот код возвращает результат немного отличается от вашей:
Id Rank Date
1 7 2015-08-07
1 8 2015-08-16
1 7 2015-08-19 <-- you've got here 2015-08-15
2 7 2015-08-01
2 8 2015-08-16
2 7 2015-08-26
В блоке (Ранг 8 Id 1) начали на 16/08, так грести 15/08 для ранга 7 связан с первым блоком (rank7 Id1).
Если вы по-прежнему нужна ваша сортировкой (так 15/08 ранг 7 связан со вторым блоком (rank7 id1)), то вы должны предоставить свои собственные данные RowSorting, а затем спросить здесь о другом решении для другой задачи)
Искать что-то вроде «SQL первой строки в группе» Вот один: http://stackoverflow.com/questions/3800551/select-first-row-in-each-group- по-группе – shawnt00
Почему 1,7,15/08/2015 повторяется дважды один раз за 07/08 и 15/08 – TheGameiswar
Нет, это не повторяется ... 1 и 7 повторяются, так как я хочу, чтобы выход для определенной партии id и rank – user2941762