Вычисление медианы HQL
От: bit85  
Дата: 18.11.07 09:21
Оценка:
Добрый день ! Если кто нибудь сталквался с такой задачей 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' — Хитрик Денис
Re: Вычисление медианы HQL
От: GarryIV  
Дата: 18.11.07 22:33
Оценка:
Здравствуйте, bit85, Вы писали:

B>Добрый день ! Если кто нибудь сталквался с такой задачей Nhibernate или знает как ее решить помогите решить ее! Очень надо!

B>Задача заключается в том что бы вычислить медиану(по ценам столбец price) в огромной таблице где более 5 000 000 записей
B>По сути, эта медиана есть при четном колтчестве чисел — среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве

1. Использовать native query
2. Использовать хранимую процедуру
WBR, Igor Evgrafov
Re[2]: Вычисление медианы HQL
От: bit85  
Дата: 19.11.07 12:03
Оценка:
Здравствуйте, 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
Re[3]: Вычисление медианы HQL
От: Jericho113 Украина  
Дата: 20.11.07 12:05
Оценка:
Здравствуйте, bit85, Вы писали:


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 хранимую процеду с параметрами не подскажите плиз!

вот например есть пример вычисления медианы

execute dbo.m_wholeprice
GO


сама проуедура!

CREATE PROCEDURE [dbo].[m_wholeprice] AS
-- declare @t table(price money PRIMARY KEY CLUSTERED)

insert alper1 values(1, 100, 90)
insert alper1 values(2, 200, 180)
insert alper1 values(3, 300, 270)
insert alper1 values(4, 400, 360)

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???
например у меня есть хранимка котороя высчитывает медиану по каким то параметрам

execute dbo.m_wholeprice
GO


CREATE PROCEDURE [dbo].[m_wholeprice] AS
-- declare @t table(price money PRIMARY KEY CLUSTERED)

insert alper1 values(1, 100, 90)
insert alper1 values(2, 200, 180)
insert alper1 values(3, 300, 270)
insert alper1 values(4, 400, 360)

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

как ее вызвать и передать параметр типа ид товара вычислить медиану Заранее спасибо!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.