DECLARE @t TABLE ( id int, [tm] [smalldatetime] ) INSERT INTO @t VALUES (1, CAST(N'2017-03-16 18:20:00' AS SmallDateTime)) ,(2, CAST(N'2017-03-16 08:07:00' AS SmallDateTime)) ,(3, CAST(N'2017-03-09 19:37:00' AS SmallDateTime)) ,(4, CAST(N'2017-03-08 20:19:00' AS SmallDateTime)) ,(5, CAST(N'2017-03-07 04:12:00' AS SmallDateTime)) ,(6, CAST(N'2017-03-03 05:12:00' AS SmallDateTime)) ,(7, CAST(N'2017-03-01 07:26:00' AS SmallDateTime)) --SELECT * FROM @t DECLARE @datScanStart DATE = '20170311'; DECLARE @minRows int = 6; DECLARE @nRow int = 0; WITH c AS (SELECT ROW_NUMBER() OVER(ORDER BY tm DESC) r, * FROM @t) SELECT TOP(1) @nRow = r FROM c WHERE tm < @datScanStart ORDER BY r -- находим число строк по дате начала сканирования IF @nRow < @minRows -- если < 6 тогда берем первые 6 SELECT TOP(@minRows) * FROM @t ORDER BY tm DESC ELSE -- иначе > 6 берем по дате сколько получится SELECT * FROM @t WHERE tm > @datScanStart ORDER BY tm DESC
↧
Оптимизация запроса
↧