Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Функция МЕДИАНА на MS SQL  [new]
Полина
Member

Откуда: Петербург
Сообщений: 205
Помогите плз если кто сталкивался. Нужно в стат расчетах вместо функции AVG использовать функцию МЕДИАНА.
из справочника MS Excel
Медиана — это число, которое является серединой множества чисел, то есть половина чисел имеют значения большие, чем медиана, а половина чисел имеют значения меньшие, чем медиана.

Есть ли такая на T-SQL? Может есть идеи как ее написать самой? Может кто сталкивался?
17 окт 05, 12:17    [1974497]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
Glory
Member

Откуда:
Сообщений: 104760
1. Нет такой функции
2. Пронумеровать числа в соответствии с возрастанием их значения
17 окт 05, 12:27    [1974553]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
По сути, эта медиана есть при четном колтчестве чисел - среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве.
В чем сложность при написании?
17 окт 05, 12:32    [1974572]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
Полина
Member

Откуда: Петербург
Сообщений: 205
tpg
По сути, эта медиана есть при четном колтчестве чисел - среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве.
В чем сложность при написании?

Спасибо! Этой закономерности не заметила, тихо горожу огород ...
17 окт 05, 12:38    [1974603]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
На правах рекламы :)
Кен Хендерсон Проф. руководство по Transact-SQL Глава 8.
17 окт 05, 12:40    [1974612]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
Полина
Member

Откуда: Петербург
Сообщений: 205
Ray D
На правах рекламы :)
Кен Хендерсон Проф. руководство по Transact-SQL Глава 8.

:-))
17 окт 05, 12:42    [1974625]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
BrokenPot
Member

Откуда: Киев
Сообщений: 1405
Полина
tpg
По сути, эта медиана есть при четном колтчестве чисел - среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве.
В чем сложность при написании?

Спасибо! Этой закономерности не заметила, тихо горожу огород ...


Наверное, это для случая, когда каждое число встречается в наборе лишь один раз...

А если в наборе - одиннадцать чисел: десять чисел 12 и одно 20, то какова будет медиана?
17 окт 05, 12:47    [1974664]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
BrokenPot
А если в наборе - одиннадцать чисел: десять чисел 12 и одно 20, то какова будет медиана?
12
17 окт 05, 12:56    [1974729]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Функция МЕДИАНА на MS SQL  [new]
Storich
Member

Откуда:
Сообщений: 2
tpg
По сути, эта медиана есть при четном колтчестве чисел - среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) или число по средине ряда чисел при их нечетном количестве.
В чем сложность при написании?

Что за бред, медиана это число расположенное в середине отсортированной последовательности.

Вот пример: 0 1 1 1 1 10
среднее арифметическое между двумя крайними из половин (большее в нижней половине и меньшее в верхней) = 5
А медиана = 1

Эх вот бы вместо средней зарплаты была бы медиана, тогда бы увидели реальный уровень зарплат на предприятии.(Смотри пример, зп в тысячах уе. при этом в отчетность о средней зп идет 2.3 тыс)
27 окт 09, 14:04    [7844486]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
Storich
Member

Откуда:
Сообщений: 2
Простите, неправильно понял суть верхних и нижних половин.

100
4
4

2
2
2

Если так расположить числа, то всё ок.
27 окт 09, 14:17    [7844582]     Ответить | Цитировать Сообщить модератору
 Re: Функция МЕДИАНА на MS SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Не прошло и пяти лет, да.
27 окт 09, 15:06    [7844906]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Функция МЕДИАНА на MS SQL  [new]
AlDeveloper
Member

Откуда:
Сообщений: 34
Для тех, кто попадает на эту тему

Есть решение на stackoverflow.com, ответ с рейтингом 57(сейчас может быть и выше). Решение оригинальное но на практике показало, что на небольшом объеме данных все ок но стоить количеству записей превысить несколько тысяч как оно перестает работать. Я немного модифицировал запрос, что позволило производить расчет на большом объеме данных.

Код с stackoverflow.com
DECLARE @t TABLE ( val INT )

INSERT @t (val ) VALUES 
(123), 
(234),
(249),
(348),
(435),
(547),
(879),
(975),
(350)

SELECT
  AVG( val)
FROM
(
  SELECT
    t.val ,
    ROW_NUMBER() OVER (ORDER BY val ASC ) AS RowAsc,
    ROW_NUMBER() OVER (ORDER BY val DESC ) AS RowDesc
  FROM @t t
) x
WHERE
  RowAsc IN ( RowDesc, RowDesc - 1, RowDesc + 1)

Модифицированный код
DECLARE @t TABLE ( val INT )

INSERT @t (val ) VALUES 
(123), 
(234),
(249),
(348),
(435),
(547),
(879),
(975),
(350)

DECLARE 
  @count BIGINT = (SELECT COUNT(*) FROM @t) + 1

SELECT
  AVG( val)
FROM
(
  SELECT 
    t2.val,
    t2.RowAsc,
    @count - t2.RowAsc AS RowDesc
  FROM
  (
    SELECT
      t.val ,
      ROW_NUMBER() OVER (ORDER BY val ASC ) AS RowAsc
    FROM @t t
  ) t2
) x
WHERE
  RowAsc IN ( RowDesc, RowDesc - 1, RowDesc + 1)
22 апр 14, 21:01    [15919157]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить