Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация запроса  [new]
Massa52
Member

Откуда:
Сообщений: 387
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
17 мар 17, 07:59    [20304508]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
А вопрос-то в чём?
17 мар 17, 08:20    [20304530]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Massa52
Member

Откуда:
Сообщений: 387
Akina,

Да как то запрос выглядит кривым. Взгляд со стороны нужен. Может одним запросом можно сделать то, что у меня в несколько запросов получилось.
17 мар 17, 08:25    [20304536]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Ну в общем да... вместо того, чтобы просто запросить COUNT(*), ты сперва нумеруешь все записи, а потом сортируешь по убыванию номера и берёшь самый первый (наибольший то есть)... оригинальненько так.
17 мар 17, 09:10    [20304612]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Massa52
Member

Откуда:
Сообщений: 387
Akina,

Я переделываю код VBA в SQL. В цикле перебираются записи и по достижению 6 строк или же по дате начала сканирования цикл завершается. Получилось как получилось. Но осадочек - что можно проще остался.
17 мар 17, 09:19    [20304635]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Ну тогда видимо получится что-то типа
IF (SELECT COUNT(*) FROM @t WHERE tm > @datScanStart) < @minRows   
-- если < 6 тогда берем первые 6
    SELECT TOP(@minRows) * FROM @t ORDER BY tm DESC
ELSE 
-- иначе > 6 берем по дате сколько получится 
    SELECT * FROM @t WHERE tm > @datScanStart ORDER BY tm DESC
17 мар 17, 09:47    [20304733]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
Massa52
Я переделываю код VBA в SQL. В цикле перебираются записи и по достижению 6 строк или же по дате начала сканирования цикл завершается.

За такое на костре обычно сжигают.
Где вменяемое ТЗ, а не ваша интерпретация написанного на VB кода?
17 мар 17, 10:45    [20304902]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить