Форум: "Базы";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизЗапрос на выборку Найти похожие ветки
← →
S@shka © (2004-10-12 17:16) [0]Как действовать в таких случаях??
Есть набор данных
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
А как лучше такого рода задачи решаются ????
Заранее спасибо
← →
Romkin © (2004-10-12 17:26) [1]Первым вариантом :))
В идеале, если скорости не хватает, можно сделать денормализацию: сделать таблицу, уже содержащую нужные VALUE_C для каждого ID_C (оба поля - первичный ключ), и управлять ею триггерами на исходной таблице.
Вообще-то что-то мне говорит, что VALUE_C здесь лучше были бы не окончательным значением, а дельтой, чтобы вместо max считать sum
← →
Johnmen © (2004-10-12 17:26) [2]
SELECT *
FROM Table T1
WHERE T1.TIME_C=(SELECT MAX(T2.TIME_C)
FROM Table T2 WHERE T2.ID_C=T1.ID_C)
← →
S@shka © (2004-10-12 23:20) [3]To Johnmen
Это конечно да, но
на 10000 записей
при неидексированной таблице 100 000 000 чтений
в противовес варианту 1 117 000 чтений
← →
Johnmen © (2004-10-12 23:56) [4]>S@shka ©
"Ну что тебе сказать про Сахалин?" (c)
>Как действовать в таких случаях??
>А как лучше такого рода задачи решаются ????
Точно не так: "...неидексированной таблице..." !
И почему беспокоит кол-во чтений? Скорость? Т.е.борьба за неё с пом.ХП, а не индексов?
ЧуднО...:)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.036 c