Частичный distinct, неполный group by в агрегатах?
Добавлено: 11 июн 2006, 00:37
В упрощенном виде таблица выглядит так:
CREATE TABLE LINES (
ID INTEGER NOT NULL,
EVENT_ID INTEGER NOT NULL,
VTIME TIMESTAMP,
VALUE DECIMAL(8,2) ,
);
Т.е. имется некоторые события (EVENT_ID), для которых фиксирутся показания (VALUE) и время снятия показаний (VTIME).
Задача - выбрать самые первые (последние, третьи и т.д) показания для каждого события.
Запрос типа:
маслал минут 40 (в талице полмиллиона записей), я не дождался результатов и его прибил.
Вопрос - кто тормозит, я или FB?
Вроде задачка-то простая. Если отбросить всякие SQL, то выглядит элементарно: сортируем таблицу по event_id, vtime, затем выбираем самые первые записи для каждого event_id. Т.е. так, как буд-то можно было указать distinct только для одного поля (EVENT_ID):
Либо group by не для всех полей:
Либо был агрегат типа FIRST:
Так как же выбрать нужные значения одним (желательно эффективным
) запросом, не прибегая к к процедурам, промежуточным результатам, вьюхам?
CREATE TABLE LINES (
ID INTEGER NOT NULL,
EVENT_ID INTEGER NOT NULL,
VTIME TIMESTAMP,
VALUE DECIMAL(8,2) ,
);
Т.е. имется некоторые события (EVENT_ID), для которых фиксирутся показания (VALUE) и время снятия показаний (VTIME).
Задача - выбрать самые первые (последние, третьи и т.д) показания для каждого события.
Запрос типа:
Код: Выделить всё
select l.event_id, l.vtime,l.value from lines l
where l.vtime = (
select min(l2.vtime) from lines l2
where l.event_id = l2.event_id
)Вопрос - кто тормозит, я или FB?
Вроде задачка-то простая. Если отбросить всякие SQL, то выглядит элементарно: сортируем таблицу по event_id, vtime, затем выбираем самые первые записи для каждого event_id. Т.е. так, как буд-то можно было указать distinct только для одного поля (EVENT_ID):
Код: Выделить всё
select distinct (l.event_id), l.value from lines l
order by l.vtime
Код: Выделить всё
select l.event_id, min(l.vtime), l.value from lines l
group by l.event_id
Код: Выделить всё
select l.event_id, FIRST(l.value) from lines l
order by l.vtime
group by l.event_id