powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса. Прошу совет
14 сообщений из 14, страница 1 из 1
Оптимизация запроса. Прошу совет
    #40091753
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друзья, прошу помочь!

Всевышний свел меня с сервером Microsoft SQL Server 2008 R2 (SP3-GDR) (KB4057113) - 10.50.6560.0 (X64) и пока не знаю, что делать.

Мне необходимо запросом получить срез последних значений по группе счетчиков. Я пытаюсь это сделать вот таким вот простым образом (запрос привожу в сокращенном виде):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH
baseData AS 
(
SELECT idchannel idChan, time dT, value_unit potr 
FROM IZM_TII 
)

,lastDt AS 
(SELECT idChan, max(dT) mDt FROM baseData GROUP BY idChan)

,findTimeCut AS
(
SELECT min(mDt) cutDt FROM lastDt
)

,cutData AS
(
SELECT bD.idChan, bD.dT, bD.potr
FROM baseData bD
WHERE dT = (SELECT cutDt FROM findTimeCut)
)

SELECT * FROM cutData



Запрос работает неудовлетворительно долго.
Ранее, я использовал в таких случаях рамочные функции. В этой версии, насколько я понял из документации, они не поддерживаются.
Пытался изучать статьи. Мне показалось, что тут имеет смысл присвоить значение подзапроса "findTimeCut " в отдельную переменную. Но и это не получилось. Не понял, как в данной конструкции с WITH объявить ее и применить так, чтобы можно было использовать в последующем подзапросе.

Прошу посоветовать мне, как можно оптимизировать это элементарный запрос в моих условиях применения 2008 и конструкции WITH.
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091759
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Ранее, я использовал в таких случаях рамочные функции. В этой версии, насколько я понял из документации, они не поддерживаются .

это оконные что ли ?
брэхня !
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091766
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441

Прошу посоветовать мне, как можно оптимизировать это элементарный запрос в моих условиях применения 2008 и конструкции WITH.


Печально я гляжу на это поколенье...
Это сработает даже на MS SQL 2000.
Код: sql
1.
2.
3.
4.
5.
6.
--называется "коррелированный запрос"
with t as ( SELECT idchannel idChan, time dT, value_unit potr FROM IZM_TII )
select * from t
  where dT = (select max(dt) from t as t1 where t1.idChan = t.idChan)

-- конешно, лучше бы иметь уникальный идентификатор строки, а то повтор dT приведет к задвоению
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091767
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,
Да, я имел в виду оконные функции.
По ним я, как минимум, находил последние по дате значения без вложенного запроса.
Под "брехня" Вы имеете в виду то, что в 2008 они поддерживаются?
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091773
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Православный запрос должон выглядеть так

Код: sql
1.
2.
3.
with t as ( SELECT rowID, idchannel idChan, time dT, value_unit potr FROM IZM_TII )
select * from t
  where rowID  = (select top(1) rowID from t as t1 where t1.idChan = t.idChan order by dT desc)
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091787
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Begimot441

Прошу посоветовать мне, как можно оптимизировать это элементарный запрос в моих условиях применения 2008 и конструкции WITH.


Печально я гляжу на это поколенье...
Это сработает даже на MS SQL 2000.
Код: sql
1.
2.
3.
4.
5.
6.
--называется "коррелированный запрос"
with t as ( SELECT idchannel idChan, time dT, value_unit potr FROM IZM_TII )
select * from t
  where dT = (select max(dt) from t as t1 where t1.idChan = t.idChan)

-- конешно, лучше бы иметь уникальный идентификатор строки, а то повтор dT приведет к задвоению

нуу, с СТЕ в 2000 ты "гарячнул" )
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091788
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Под "брехня" Вы имеете в виду то, что в 2008 они поддерживаются?
yes !
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091793
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court
aleks222
пропущено...


Печально я гляжу на это поколенье...
Это сработает даже на MS SQL 2000.
Код: sql
1.
2.
3.
4.
5.
6.
--называется "коррелированный запрос"
with t as ( SELECT idchannel idChan, time dT, value_unit potr FROM IZM_TII )
select * from t
  where dT = (select max(dt) from t as t1 where t1.idChan = t.idChan)

-- конешно, лучше бы иметь уникальный идентификатор строки, а то повтор dT приведет к задвоению

нуу, с СТЕ в 2000 ты "гарячнул" )


Убрать with может даже ясельник.
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091825
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
Огромное спасибо! Ранее я игнорировал эти виды запросов.

Но помогите, мне, пож-та, до конца.
Вы мне любезно подсказали, как оптимизировать поиск МАКСИМАЛЬНОГО для каждого idChan.
Но мне-то надо СРЕЗ. Т.е. "групповой максимум", если можно так сказать.

Я сейчас пытаюсь применить технику коррелированных запросов для этого, и у меня не выходит.
Подтолкните меня, пож-та!
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091849
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
Мне необходимо запросом получить срез последних значений по группе счетчиков. Я пытаюсь это сделать вот таким вот простым образом (запрос привожу в сокращенном виде):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH
baseData AS 
(
SELECT idchannel idChan, time dT, value_unit potr 
FROM IZM_TII 
)

,lastDt AS 
(SELECT idChan, max(dT) mDt FROM baseData GROUP BY idChan)

,findTimeCut AS
(
SELECT min(mDt) cutDt FROM lastDt
)

,cutData AS
(
SELECT bD.idChan, bD.dT, bD.potr
FROM baseData bD
WHERE dT = (SELECT cutDt FROM findTimeCut)
)

SELECT * FROM cutData

Это эквивалентно такому
Код: sql
1.
2.
3.
4.
5.
select
 b.idchannel b.idChan, b.time dT, b.value_unit potr 
from
 (select top (1) max(time) from IZM_TII group by idChan order by max(time)) a (min_maxtime) join
 IZM_TII b on b.time = a.min_maxtime;
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091887
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Спасибо! Но, к сожалению, мой sqlDbx, при этом, выдает ошибку


Неправильный синтаксис около конструкции ".".. Error 102. SQLSTATE 42000
Неправильный синтаксис около ключевого слова "order".. Error 156. SQLSTATE 42000
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091891
Begimot441
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Простите! Я тормоз! Все прекрасно!
Благодарю за помощь и буду изучать Вашу конструкцию. Не знал такой!
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091896
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Begimot441
aleks222,
Огромное спасибо! Ранее я игнорировал эти виды запросов.

Но помогите, мне, пож-та, до конца.
Вы мне любезно подсказали, как оптимизировать поиск МАКСИМАЛЬНОГО для каждого idChan.
Но мне-то надо СРЕЗ. Т.е. "групповой максимум", если можно так сказать.

Я сейчас пытаюсь применить технику коррелированных запросов для этого, и у меня не выходит.
Подтолкните меня, пож-та!


Предлагаете угадать чего там у вас "группа"?

Begimot441

Но мне-то надо СРЕЗ. Т.е. "групповой максимум", если можно так сказать.


Вот на пальцах и розжувай, что там у тя в голове за "срез" и чаво такое ""групповой максимум", если можно так сказать".
Телепузики в отпуску.

По твоему примеру, ты получаешь самое раннее из всех последних значений для каждого idChan.

Код: sql
1.
2.
3.
4.
with t as ( SELECT rowID, idchannel idChan, time dT, value_unit potr FROM IZM_TII )
select top(1) * from t
  where rowID  = (select top(1) rowID from t as t1 where t1.idChan = t.idChan order by dT desc)
  order by dT asc
...
Рейтинг: 0 / 0
Оптимизация запроса. Прошу совет
    #40091905
mnbvcx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Begimot441, когда я последний раз решал задачу по нахождению топ-3 показаний ИПУ, я использовал APPLY. Вроде даже ф-ю писал для этого.
Работало в ms sql 2005.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация запроса. Прошу совет
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]