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

Откуда:
Сообщений: 4
Есть таблица с принятыми пакетами разных типов

IdPacket -номер пакета
DateRcv- время приёма
IdPacket-номер пакета
Type-тип пакета
PacketData- данные

Нужно выбрать последние пакеты всех типов этого номера, лежащих в диапазоне времени от xx до yy.
Есть такой запрос:
SELECT * FROM AmunReceiver WHERE idPacket=22 and DataType=1 and DateRcv BETWEEN GETUTCDATE()-1 and GETUTCDATE()
UNION
SELECT * FROM AmunReceiver WHERE idPacket=22 and DataType=2 and DateRcv BETWEEN GETUTCDATE()-1 and GETUTCDATE()

Но хотелось бы сделать всё в один запрос а не в два.
Есть идеи?
15 июл 11, 17:36    [10981606]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Нужна помощь!  [new]
Crimean
Member

Откуда:
Сообщений: 13147
DataType IN ( 1,2 )?
15 июл 11, 17:37    [10981616]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Нужна помощь!  [new]
suhanz
Member

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

Немного не так выразился, нужно что бы возвращались последние данные по времени и в нужном промежутке времени, и разных типов

т.е
есть
IDrecord DateRcv DataType IDPacket
18 2011-07-15 09:50:21.917 1 22
20 2011-07-15 09:50:25.970 2 22
22 2011-07-15 12:17:35.920 2 22

Нужно чтобы возвращалось 22 и 18
15 июл 11, 17:53    [10981709]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Нужна помощь!  [new]
suhanz
Member

Откуда:
Сообщений: 4
suhanz
Есть таблица с принятыми пакетами разных типов

IdPacket -номер пакета
DateRcv- время приёма
IdPacket-номер пакета
Type-тип пакета
PacketData- данные

Нужно выбрать последние пакеты всех типов этого номера, лежащих в диапазоне времени от xx до yy.
Есть такой запрос:
SELECT * FROM AmunReceiver WHERE idPacket=22 and DataType=1 and DateRcv BETWEEN GETUTCDATE()-1 and GETUTCDATE()
UNION
SELECT * FROM AmunReceiver WHERE idPacket=22 and DataType=2 and DateRcv BETWEEN GETUTCDATE()-1 and GETUTCDATE()

Но хотелось бы сделать всё в один запрос а не в два.
Есть идеи?


В моих запросах нужно ещё добавить ORDER BY DateRCV
15 июл 11, 18:05    [10981783]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Нужна помощь!  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
suhanz,

select min(idPacket), ... from... where DataType in (1, 2) and ...
group by ...
15 июл 11, 18:26    [10981874]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Нужна помощь!  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
suhanz
Crimean,

Немного не так выразился, нужно что бы возвращались последние данные по времени и в нужном промежутке времени, и разных типов

т.е
есть
IDrecord DateRcv DataType IDPacket
18 2011-07-15 09:50:21.917 1 22
20 2011-07-15 09:50:25.970 2 22
22 2011-07-15 12:17:35.920 2 22

Нужно чтобы возвращалось 22 и 18
1. В стартовом посте два SELECTа и UNION между ними - это ОДИН запрос, а не два!
2.
SELECT TOP(1) WITH TIES *
FROM AmunReceiver
WHERE idPacket=22 AND DataType IN(1,2) AND DateRcv BETWEEN GETUTCDATE()-1 AND GETUTCDATE()
ORDER BY ROW_NUMBER()OVER(PARTITION BY DataType ORDER BY DateRcv DESC);
Не проверял.
15 июл 11, 22:12    [10982781]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Нужна помощь!  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вообще-то, строго говря, корректнее DATEADD(DAY,-1, GETUTCDATE()),
а не GETUTCDATE()-1
15 июл 11, 22:14    [10982794]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Нужна помощь!  [new]
suhanz
Member

Откуда:
Сообщений: 4
iap,
Я имел ввиду 2 запроса в плане доступа к базе, доступ будет выполнен 2 раза, по разным типам, а надо чтоб один раз.
А вообще спасибо за ответы, в понедельник попробую=)
16 июл 11, 18:48    [10984465]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить