Здравствуйте, __MasteR__, Вы писали:
__M>Добрый день. Не могу справиться с такой задачкой:
__M>Имеется таблица:
__M>id(uuid) Time(int) Instrument(string) AvgLatency(int) Count(int)
__M>По заданному id необходимо для всех значений Time выдать сумму от Count сгруппированного по инструментам (что легко), а также некоторое значение, которое получается как среднее от AvgLatency* по инструментам. Где AvgLatency* получается как AvgLatency для каждого инструмента из которого вычтено первое по времени ненулевое значение для этого инструмента.
__M>Очень надеюсь на помощь RSDN'овцев.
Добрый день!
Не очень прозрачно сформулирован вопрос... Если я правильно понял, то если бы была колонка AvgLatency* в таблице, то запрос бы выглядел так:
select Instrument, avg(AvgLatency*), sum(Count)
......
group by Instrument
Если да (и я правильно понял задачу) то представляется логичным использовать курсор и ручное вычисление агрегатных функций. Открываете курсор с выборкой отсортированной по Instrument, Time. Для каждого Instrument на первой строке с ненулевым Time имеем вычитаемое значение для AvgLatency*. Если хочется иметь именно запрос, то можно пронумеровать строки выборки, вычислить номера строк с вычитаемыми значениями и построить требуемое
create table test(
xTime int,
xInstrument varchar(12),
xAvgLatency int,
xCount int
);
x-ы добавил чтобы не совпадало с ключевыми словами.
select
test.xInstrument,
AVG(test.xAvgLatency - t.xAvgLatency) Avg,
SUM(test.xCount)
from test join
(
select
numbered_test.xInstrument,
numbered_test.xAvgLatency
from
(select ROW_NUMBER() over (order by xInstrument, xTime) n, * from test where xTime > 0) numbered_test
join
(select xInstrument, MIN(n) min_row from(
select ROW_NUMBER() over (order by xInstrument, xTime) n, xInstrument from test where xTime > 0) t
group by xInstrument ) min_rows on min_rows.min_row = numbered_test.n
) t on t.xInstrument = test.xInstrument
group by test.xInstrument