re: [Sql] получить предыдущую, следующую запись в групповом запросе?
dense_rank не подойдёт?
dense_rank не подойдёт?подойдет - если есть уникальность по Time, но код будет такой же, только вместо row_number будет dense_rank
Не знаю, эффективнее ли, может даже план совпадать будет, но текст запроса другой - TOP 1 WITH TIES с соотв ORDER BY. Ну и плюс индекс по времени может сильно менять картину
но текст запроса другой - TOP 1 WITH TIES с соотв ORDER BY.полный текст запроса напиши, плиз.
ps
я с with еще не разбирался, поэтому пока не могу прокомментировать твое предложение
select top 1 with ties
ObjID, Value, Time
from objId_value_time_table
where Time < @selectedTime
order by row_number over (partition by ObjId order by Time desc)
Посмотрел на sysobjects - вроде не быстрее так - вариант с фильтрацией по row_number etc. 13% от общего батча, с TOP 1 - 21% (запустил оба варианта для row_number rank и dense_rank хотя визуально разница неочевидна - может на больших объемах будет разница заметна.
Можно еще посмотреть вариант с группировкой в подзапросе, но думаю он медленнее будет, чем аналитические функции
Если есть индекс по Time (Time + ObjID) - можно попробовать туда добавить как included columns оставшиеся вытаскиваемые колонки, тогда обращения к самой таблице не будет
как included columnsэто что такое?
В общем, это данные, которые не участвуют в построении индекса, но присутствуют в листовых узлах
Оставить комментарий
Dasar
в продолжении постатаблица
objid, value, time
необходимо эффективно выполнить следующий запрос:
по каждому Objid получить последнюю запись, которая шла перед заданным временем
в mssql(начиная с 2005) это делается так