Добрый день ! Если кто нибудь сталквался с такой задачей Nhibernate или знает как ее решить помогите решить ее! Очень надо!
Задача заключается в том что бы вычислить медиану(по ценам столбец price) в огромной таблице где более 5 000 000 записей
По сути, эта медиана есть при четном колтчестве чисел — среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве
SQL
как я понял надо вставить индексный столбец
// сортируем
create clusterred index price on myteble(price)
ALTER mytable add k1 int identity
DROP index mytable.price
create clustered index k1 on mytable.price
Select top 1@rows=rows from sysindexes where id=OBJECT_ID('mytable')
order by inid
Select avg(price) as Медиана from mytable
where k1 between @rows/2 and (@rows/2)+SIGN(@rows+1%2)
Мне надо написать запрос HQL(Nhibernate) получить медиану как это сделать??
дело втом что записи добавляется каждый час как оптимизировать запрос
Заранее спасибо!
18.11.07 21:55: Перенесено модератором из '.NET' — Хитрик Денис
Здравствуйте, bit85, Вы писали:
B>Добрый день ! Если кто нибудь сталквался с такой задачей Nhibernate или знает как ее решить помогите решить ее! Очень надо! B>Задача заключается в том что бы вычислить медиану(по ценам столбец price) в огромной таблице где более 5 000 000 записей B>По сути, эта медиана есть при четном колтчестве чисел — среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве
1. Использовать native query
2. Использовать хранимую процедуру
Здравствуйте, GarryIV, Вы писали:
GIV>Здравствуйте, bit85, Вы писали:
B>>Добрый день ! Если кто нибудь сталквался с такой задачей Nhibernate или знает как ее решить помогите решить ее! Очень надо! B>>Задача заключается в том что бы вычислить медиану(по ценам столбец price) в огромной таблице где более 5 000 000 записей B>>По сути, эта медиана есть при четном колтчестве чисел — среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве
GIV>1. Использовать native query GIV>2. Использовать хранимую процедуру
а как нваписать на етот запрос??? Я первый раз cстолкнулся с HNIBERNATE
select Median=avg(distinct 1.0*price)
from (select d1.price
from Alper d1 cross join Alper d2
group by d1.id,d1.price
having sum(case when d2.price=d1.price then 1 else 0 end)>=
abs(sum(case when d2.price<d1.price then 1 when d2.price>d1.price then -1 else 0
end)))d1
GIV>>1. Использовать native query GIV>>2. Использовать хранимую процедуру
B> а как нваписать на етот запрос??? Я первый раз cстолкнулся с HNIBERNATE
вам посоветовали использовать хранимку — имхо самый оптимальный способ..
HQL имхо не самый лучший язык для работы с большим объемом данных и сложными вычислениями.
NetDigitally yours ....
Re[4]: Вычисление медианы HQL
От:
Аноним
Дата:
22.11.07 11:00
Оценка:
Здравствуйте, Jericho113, Вы писали:
J>Здравствуйте, bit85, Вы писали:
GIV>>>1. Использовать native query GIV>>>2. Использовать хранимую процедуру
B>> а как нваписать на етот запрос??? Я первый раз cстолкнулся с HNIBERNATE J>вам посоветовали использовать хранимку — имхо самый оптимальный способ.. J>HQL имхо не самый лучший язык для работы с большим объемом данных и сложными вычислениями.
как вызвать через HNibernate хранимую процеду с параметрами не подскажите плиз!
declare @rc int, @rc05 int, @maxprice money, @maxprice2 money
set @rc=(select count(*) FROM alper1)
set @rc05=@rc/2
if @rc05*2=@rc begin
set @rc05=@rc05+1
set rowcount @rc05
select @maxprice2=@maxprice, @maxprice=price FROM alper1 ORDER BY price
select (@maxprice+@maxprice2)/2
end else begin
set @rc05=@rc05+1
set rowcount @rc05
select @maxprice=price FROM alper1 ORDER BY price
select @maxprice
end
GO
Re[4]: Вычисление медианы HQL
От:
Аноним
Дата:
22.11.07 11:14
Оценка:
как вызвать Хранимую процедуру в Nhibernate???
например у меня есть хранимка котороя высчитывает медиану по каким то параметрам
declare @rc int, @rc05 int, @maxprice money, @maxprice2 money
set @rc=(select count(*) FROM alper1)
set @rc05=@rc/2
if @rc05*2=@rc begin
set @rc05=@rc05+1
set rowcount @rc05
select @maxprice2=@maxprice, @maxprice=price FROM alper1 ORDER BY price
select (@maxprice+@maxprice2)/2
end else begin
set @rc05=@rc05+1
set rowcount @rc05
select @maxprice=price FROM alper1 ORDER BY price
select @maxprice
end
GO
как ее вызвать и передать параметр типа ид товара вычислить медиану Заранее спасибо!!!