Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi, BDE, Paradox, SQL запрос, как сделать запрос? 
:(
    Опции темы
Матроскин
Дата 22.8.2004, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.6.2004
Где: Владивосток

Репутация: нет
Всего: нет



Дело в том, что я уже месяц делаю программу по японскому морю. Сущность в том, что бы проставить на карте точки и получить отчёт - скорости звука в этих точках на разных глубинах. Но, как вы понимаете, проставить точки на карте в точности в том месте, которому соответствует запись в БД нереально. Поэтому метод простой - подбираем ближайшую существующую точку в БД.
Таблица данных имеет 1'200'000 записей.
Структура:
id
lat - широта
lon - долгота
deep - глубина
velo - скорость звука
be - номер дня в году, с которого началось измерение
ee - -||- в котором закончилось измерение (они все длились ровно месяц)

Т.о. задача такова:
вход: lat_u, lon_u - координаты точки пользователя в морских координатах
Например
lat_u = 43.0
lon_u = 134.0
Выход
lat_u = 43.3
lon_u = 134.34

Вот так господа

PM MAIL   Вверх
<Spawn>
Дата 22.8.2004, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



Код

Type
 TSeaPosition = record
   lat_u, lon_u: Real;
 end;

function GetRealSeaPosition(SeaPosition: TSeapPosition): TSeaPosition;
begin
 {Получаем первую ближайшую}
 Query.SQL.Text := 'SELECT Max(lat) FROM Table WHERE lat <= :lat_u';
 Query.ParamByName('lat_u').AsFloat := SeaPosition.lat_u;
 Query.Open;
 Query.Close;
 
 Result.lat_u := Query.FieldByName('lat').AsFloat;

 {Получаем вторую ближайшею точку}
 Query.SQL.Text := 'SELECT Min(lat) FROM Table WHERE lat >= :lat_u';

 Query.ParamByName('lat_u').AsFloat := SeaPosition.lat_u;
 Query.Open;
 Query.Close;

 {Находим ближаушую точку}
 if (SeaPosition.lat_u - Result.lat_u) > (Query.FieldByName('lat_u').AsFloat - SeaPosition.lat_u) then
   Result.lat_u := SeaPosition.lat_u;

 {тоже самое для lot_n}
end;

{далее где то используешь примерно так}
var
 RealPosition: TSeaPosition;
begin
 RealPosition.lat_u := 43.3;
 RealPosition.lon_u := 134.4;
 RealPosition := GetRealSeaPosition(RealPosition);
 Query.SQL.Text := 'SELECT velo
                                   FROM Table
                                 WHERE lat = :lat_u
                                      AND lon = :lon_u';
 Query.ParamByName('lat_u').AsFloat := RealPosition.lat_u;
 Query.ParamByName('lon_u').AsFloat := RealPostition.lon_u;
 Query.Open;
 Query.Close;
 if not Query.IsEmpty then
   ShowMessage(FloatToStr(Query.FieldByName('velo').AsFloat));
end;


Примерно так - я не проверял это код, но думаю идея понятна. Да, и в функции GetRealSeaPosition нет проверки на случай если точка не будет найдена - учти это.
Добавлено @ 19:33
И еще одно замечание - у тебя 1 200 000 записей в базе. Даже если ты сделаешь индекс по полям lat и lon, то учитывая что проверка идет на больше\меньше, то индесы работать не будут, если я правильно помню одну статью - прийдется тут чего то выдумывать.

Это сообщение отредактировал(а) <Spawn> - 22.8.2004, 20:00


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Матроскин
Дата 23.8.2004, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.6.2004
Где: Владивосток

Репутация: нет
Всего: нет



Спасибо, как проверю сразу сообщу.
PM MAIL   Вверх
Матроскин
Дата 24.8.2004, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.6.2004
Где: Владивосток

Репутация: нет
Всего: нет



Да, работает. Но как тороз-з-з-з-ит! Около 7 секунд одну выборку! Лодку сто раз торпеда потопит, пока эта программа выдаст отчёт. (Шутка) Итого у меня получается 20 выборок.
Тормоззз идёт две минуты.

Это сообщение отредактировал(а) Матроскин - 24.8.2004, 20:40
PM MAIL   Вверх
<Spawn>
Дата 24.8.2004, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 2
Всего: 64



Матроскин Думай чего то с индексами.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
AntonSaburov
Дата 25.8.2004, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Цитата
Думай чего то с индексами.

Или ставь какой-нибудь SQL - они обычно заточены на базы и работают гораздо быстрее, чем локальные базы большого размера. У тебя все-таки более миллиона записей.
PM MAIL WWW ICQ   Вверх
Матроскин
Дата 25.8.2004, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.6.2004
Где: Владивосток

Репутация: нет
Всего: нет



Цитата
Матроскин Думай чего то с индексами.

Всё таки единственный выход, который я вижу это использование индексов. Как только найду решение сразу выложу.
PM MAIL   Вверх
Матроскин
Дата 30.8.2004, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 24.6.2004
Где: Владивосток

Репутация: нет
Всего: нет



Мужики оно работает!
Создаём комплексный индекс по полям Lat и Lon.

Table1.IndexName := 'iLatLon';
Table1.FindNearest([SeaPosition.lat_u, SeaPosition.lon_u]);

Ищет в доли секунды
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.