Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос на выборку [D6, FB 1.5]


S@shka ©   (2004-10-12 17:16:00) 

Как действовать в таких случаях??
Есть набор данных
ID_C    VALUE_C    TIME_C
 50       1        12.04.04 11:51
 50       2        12.04.04 11:52
 53       0        12.04.04 11:08
 54       10       12.04.04 11:10
 54       8        12.04.04 11:58
-------------------------------------------------
Необходимо выбрать по каждому ID_C значение Value_C которому соответствует максимальное TIME_C
Вариант 1:
for
  select ID_C, max(TIME_C) from TABLE
  group by ID_C
  into :I, :T
do begin
    select VALUE_C from TABLE
    where ID_C = :I and TIME_C = :T
    suspend;
  end

Вариант 2:
  есть такая штука
   for
  select ID_C, max(TIME_C) from TABLE
  group by ID_C
  into :I, :T
  as cursor tmpcursor  // !!!!!
do begin
    select VALUE_C from TABLE
    where current of tmpcursor   // НО ПОХОЖЕ в SELECT использовать это нельзя :(((
    suspend;
  end

А как лучше такого рода задачи решаются ????
Заранее спасибо


Johnmen   (2004-10-12 23:56:00) [1]

>S@shka ©

"Ну что тебе сказать про Сахалин?" (c)

>Как действовать в таких случаях??
>А как лучше такого рода задачи решаются ????

Точно не так: "...неидексированной таблице..." !
И почему беспокоит кол-во чтений? Скорость? Т.е.борьба за неё с пом.ХП, а не индексов?
ЧуднО...:)


S@shka   (2004-10-12 23:20:00) [2]

To Johnmen
Это конечно да, но
на 10000 записей
при неидексированной таблице 100 000 000 чтений
в противовес варианту 1      117 000 чтений


Romkin   (2004-10-12 17:26:00) [3]

Первым вариантом :))
В идеале, если скорости не хватает, можно сделать денормализацию: сделать таблицу, уже содержащую нужные VALUE_C для каждого ID_C (оба поля - первичный ключ), и управлять ею триггерами на исходной таблице.
Вообще-то что-то мне говорит, что VALUE_C здесь лучше были бы не окончательным значением, а дельтой, чтобы вместо max считать sum


Johnmen   (2004-10-12 17:26:00) [4]

SELECT *
FROM Table T1
WHERE T1.TIME_C=(SELECT MAX(T2.TIME_C)
                FROM Table T2 WHERE T2.ID_C=T1.ID_C)


Наверх

Титульная страница Поиск, карта сайта Написать письмо