Здравствуйте, WolfHound, Вы писали:
WH>Есть обект у него есть UID унакальный идентификатор в пределах базы.
WH>В некий момент времени изменилось несколько полей что необходимо отразить в базе.
WH>Создается точка изменения (хранится UID, point_id, time). Далие в таблицу значений сохраняютсяизменившиеся поля(у каждого есть PID унакальный идентификатор в пределах объекта).
WH>Вобщем при работе программы получается такая штука строки — точки, столбци pid'ы. Желтые ячейки пустые.
WH>
WH>Задача такая:
WH>Есть point и несколько pid'ов(от 5 до 100) Надо выбрать из базы самые последние значения которые были записаны до и в заданной точки.
WH>Сейчас делаю так
WH>WH>select *
WH>from
WH>(
WH> select point, pid, [value]
WH> from ValInt
WH> where (point in (select point from points where uid=46 and point<=100000))
WH>)a
WH>where
WH>(
WH> point in
WH> (
WH> select max(point)
WH> from
WH> (
WH> select point, pid
WH> from ValInt
WH> where (point in (select point from points where uid=46 and point<=100000))
WH> )b
WH> where b.pid = a.pid
WH> )
WH>)
WH>and (pid in (20,145,555,9834,876235))
WH>
WH>Но это медленно. И что самое противное время растет с увеличением размера базы.
WH>А когда много pid'ов план запроса превращается в страшного мутанта
А так попробовать:
select point, pid, [value]
from ValInt
where ( pid, point )
in
( select ValInt.pid, max( ValInt.point)
from ValInt join points on ValInt.point = points.point and points.uid = 46
where ValInt.point < 100000
and ValInt.pid in (20,145,555,9834,876235)
group by ValInt.pid
)