powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса - нужна агрегатная функция FIRST()
5 сообщений из 5, страница 1 из 1
Оптимизация запроса - нужна агрегатная функция FIRST()
    #38604852
Фотография TPAKTOPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет !

Есть данные
TovIdTovName DocNum 1NAME-1-LAST3 1NAME-1-PRE2 1NAME-1-FIRST1 2NAME-21
Нужно из них получить tovname из ПОСЛЕДНЕГО docnum, примерно получить
TovIdTovName 1NAME-1-LAST 2NAME-2
Сейчас я это делаю
Код: sql
1.
2.
3.
4.
5.
select MaxDoc.TovId, E2.TovName 
from  ( select E.TovId, Max(E.DocNum) as DocNum
        from  EXTERN E  
        group by 1 ) MaxDoc 
left join EXTERN E2 on E2.TovId=MaxDoc.TovId and E2.DocNum=MaxDoc.DocNum


Так же, вместо left join пробовал subselect-ом получать TovName - чуть быстрее. Как можно этот запрос ускорить ?
Идеальный вариант, пройтись за раз через таблицу (так как можно сортировать входящие данныe order by TovId, DocNum desc):
Код: sql
1.
2.
3.
select E.TovId, First(DocNum)
        from  EXTERN E  
        group by 1 


Но агрегатной функции First() на первый попавшийся запись - нету.

Замечания:
*В оригинале, таблица - внешний текстовой файл, 25 колонок VarChar, 150'000 записей, весит 130МБ. Делается импорт из внешнего източника. Нельзя создавать индексы
*Уникальных TovId где-то 10% , или select с групировкой на TovId возвращает около 15'000 записей за 2 секунды.
*SQL в примере работает почти час, что недопустимо. На каждый из этих 15'000 записей делается совпадение на всю таблицу из 150'000 строк, что бы найти правильный TovName
*Входящие данные - корявые, возможно на один и тот же TovId, иметь различное TovName , поэтому берём TovName с последнего документа, поетому всё это головокружение.
* FB 2.5.1 SuperServer, если имеет значения
...
Рейтинг: 0 / 0
Оптимизация запроса - нужна агрегатная функция FIRST()
    #38604863
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TPAKTOPA,

Код: sql
1.
2.
3.
4.
5.
6.
select TovId, substring(s from 12) TovNameForLastDocNum
from (
  select TovId, max( cast(DocNum as char(11)) || TovName ) s
  from extern e
  group by 1
);
...
Рейтинг: 0 / 0
Оптимизация запроса - нужна агрегатная функция FIRST()
    #38604879
Фотография TPAKTOPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид, спасибо, работает ! В одно чтение делается вся работа, с почти часа на две секунды стал выполнятся запрос !
...
Рейтинг: 0 / 0
Оптимизация запроса - нужна агрегатная функция FIRST()
    #38604884
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TPAKTOPA,

твой вопрос - из серии: "как сгруппировать значения по столбцу "Х", но вытащить в итоге поле, не участвовавшее в группировке, и соответствующее какому-то max()-значению (пример: получить значение курса на самую позднюю дату из какого-то диапазона)".

Я тут начал собирать такие вопросы, вот: http://www.sql.ru/forum/1082475-a/voprosy-ot-nubov-ili-spisok-dlya-kollekcii-sovety-byvalyh?hl=

Если у тебя есть что туда добавить - велкам.
...
Рейтинг: 0 / 0
Оптимизация запроса - нужна агрегатная функция FIRST()
    #38605168
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TPAKTOPA,

хм.
а E.DocNum это число?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса - нужна агрегатная функция FIRST()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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