Медиана в SQL

User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Медиана в SQL

Post by Dmitry67 »

У меня способ есть но пака не буду
Может кто нибудт более эффективный приделожит

И так есть

create table DATA (r float)

с кучей записей
Надо найти вещественное число - медиану.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Win32nipuh
Уже с Приветом
Posts: 2489
Joined: 04 Feb 2002 10:01
Location: Слава Україні!

Re: Медиана в SQL

Post by Win32nipuh »

Dmitry67 wrote:У меня способ есть но пака не буду
Может кто нибудт более эффективный приделожит

И так есть

create table DATA (r float)

с кучей записей
Надо найти вещественное число - медиану.


Если можно - уточните: что есть медиана в данной задаче с таблицей вщественных чисел?
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

В случае с N значениями это число, справа и слева от которой нахордится одингаковое количество точек

Пример

1,2,2,11,12,13,14
Медиана = 11
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

Code: Select all

select max(d2.r) 
from
(select top 50 percent r from DATA order by r) d2
User avatar
Win32nipuh
Уже с Приветом
Posts: 2489
Joined: 04 Feb 2002 10:01
Location: Слава Україні!

Post by Win32nipuh »

Vovka wrote:

Code: Select all

select max(d2.r) 
from
(select top 50 percent r from DATA order by r) d2


Может быть 51?
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Я использовал identity
Решение с процентами при большом числе точек более эффективное
Но вто только кто гарантирует что при нечетном числе случаев стредняя точка входит или нет ?
Может 50.000001 ?

А в YUKON даже так работает
select top ((select count(*)/2 from #d)) n from #d order by n
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

Dmitry67 wrote:Я использовал identity

А это как? Структуру таблицы меняли, что-ли, или всё во временную таблицу? Так не честно! :mrgreen:

Dmitry67 wrote: Но вто только кто гарантирует что при нечетном числе случаев стредняя точка входит или нет ?
Может 50.000001 ?

Фиг знает, я первое, что в голову пришло писал. Вам, датабазникам, видней.

Вот ещё вариант (не мой):

Code: Select all

select d.r
from DATA d cross join DATA i
group by d.r
having count(case when i.r <= d.r then 1 else null end ) = (count(*) + 1) / 2


[злостный и циничный оффтопик]
Dmitry67, а вот скажите мне, чтоб экзамен по MSSQL сдать (прграммерский, естессно), надо уметь всякие такие задачки решать? Или там больше про всякий BD design, normal forms, etc.?
А то вот от безделья думаю, может сертификат какой получить? :pain1:
[/злостный и циничный оффтопик]
Victor
Уже с Приветом
Posts: 2107
Joined: 04 Mar 1999 10:01
Location: Gaithersburg, MD

Post by Victor »

Медианы наша контора считать любит :)
Делал просто: заливал во временную таблицу с IDENTITY, затем брал середину. По скорости было приемлемо.
Вариант с TOP 50 PERCENT не будет работать: в случае четного количества чисел берется среднее из пары посередине:

1,2,2,11,12,13,14,14
Медиана = 11.5

Return to “Вопросы и новости IT”