IsaiSelvan Ответов: 2

Как найти медианное значение для строки в SQL server 2008


Я пытаюсь найти медианное значение в строке в sql server. но я не смог получить на него никакого ответа.


select 
(select cast(Avg(TotAvg * 1.0 )as decimal(6,2)) from (values (convert(decimal(6,2), a)),(convert(decimal(6,2), b)),(convert(decimal(6,2), c)),
(convert(decimal(6,2), d)),(convert(decimal(6,2), e)),
(convert(decimal(6,2), f)),(convert(decimal(6,2), g)),(convert(decimal(6,2), h)),(convert(decimal(6,2), i)),
(convert(decimal(6,2), j)),(convert(decimal(6,2), k)),(convert(decimal(6,2), l)),(convert(decimal(6,2), m)),
(convert(decimal(6,2), n)),(convert(decimal(6,2), o)),(convert(decimal(6,2), p)),(convert(decimal(6,2), q)),
(convert(decimal(6,2), r)),(convert(decimal(6,2), s)),(convert(decimal(6,2), s)),(convert(decimal(6,2), u))) as Totalavg(TotAvg)) 
as Median

from temp


Что я уже пробовал:

select 
(select cast(Avg(TotAvg * 1.0 )as decimal(6,2)) from (values (convert(decimal(6,2), a)),(convert(decimal(6,2), b)),(convert(decimal(6,2), c)),
(convert(decimal(6,2), d)),(convert(decimal(6,2), e)),
(convert(decimal(6,2), f)),(convert(decimal(6,2), g)),(convert(decimal(6,2), h)),(convert(decimal(6,2), i)),
(convert(decimal(6,2), j)),(convert(decimal(6,2), k)),(convert(decimal(6,2), l)),(convert(decimal(6,2), m)),
(convert(decimal(6,2), n)),(convert(decimal(6,2), o)),(convert(decimal(6,2), p)),(convert(decimal(6,2), q)),
(convert(decimal(6,2), r)),(convert(decimal(6,2), s)),(convert(decimal(6,2), s)),(convert(decimal(6,2), u))) as Totalavg(TotAvg)) 
as Median

from temp

2 Ответов

Рейтинг:
1

OriginalGriff

Возможно, если бы у вас не было двух s ценности там есть:

(convert(decimal(6,2), r)),(convert(decimal(6,2), s)),(convert(decimal(6,2), s)),
                                                  ^                          ^
Это может помочь?


IsaiSelvan

табличное значение
============
Первый ряд - 1,5,6,7,8,2,6,3,4,5,2,1,6,5,7,8,2,7,6,2,8
Второй ряд - 1,5,6,7,8,2,2,3,2,4,2,1,4,5,9,8,2,7,6,2,8

OriginalGriff

Что вы получаете, когда выполняете запрос?
А что вы ожидали получить?
Как выглядит ввод данных?

IsaiSelvan

Я уже пробовал этот формат. ниже приведен пример данных с запросом.

выбирать
(выберите литой(функция AVG(TotAvg * 1.0 )как decimal(6,2)) от (значения (преобразования(в десятичной системе(6,2), в)),(преобразование(десятичное число(6,2), б)),(преобразование(десятичное число(6,2), З.)),
(преобразования(в десятичной системе(6,2), г)),(преобразование(десятичное число(6,2), е)),
(преобразования(в десятичной системе(6,2), Ф)),(преобразование(десятичное число(6,2), г)),(преобразование(десятичное число(6,2), Н)),(преобразование(десятичное число(6,2), я)),
(преобразования(в десятичной системе(6,2), й)),(преобразование(десятичное число(6,2), к)),(преобразование(десятичное число(6,2), л)),(преобразование(десятичное число(6,2), м)),
(преобразования(в десятичной системе(6,2), Н)),(преобразование(десятичное число(6,2), о)),(преобразование(десятичное число(6,2), п)),(преобразование(десятичное число(6,2), м)),
(преобразования(в десятичной системе(6,2), Р)),(преобразование(десятичное число(6,2), з)),(преобразование(десятичное число(6,2), Т)),(преобразование(десятичное число(6,2), у))) как Totalavg(TotAvg))
как медиана от темпа

Я изменил упомянутую вами колонку. Помоги мне


значения столбцов-от a до u в строке.

табличное значение
============
Первый ряд - 1,5,6,7,8,2,6,3,4,5,2,1,6,5,7,8,2,7,6,2,8
Второй ряд - 1,5,6,7,8,2,2,3,2,4,2,1,4,5,9,8,2,7,6,2,8

OriginalGriff

И что же? Что происходит, когда вы запускаете его, и что вы ожидали, что произойдет?

IsaiSelvan

Да, я хочу получить медиану для каждой строки.

Первый Ряд - 1,5,6,7,8,2,6,3,4,5,2,1,6,5,7,8,2,7,6,2,8

Фактическое значение - 4,80 (это неверно)
Ожидаемое значение - 5 (Правильный выход)

Второй Ряд - 1,5,6,7,8,2,2,3,2,4,2,1,4,5,9,8,2,7,6,2,8

Фактическое значение - 4.47 (это неверно)
Ожидаемое Значение - 4 (Правильный Выход)

OriginalGriff

Тогда почему вы используете AVG? AVG вычисляет среднее значение, а не медиану. Среднее значение вашей первой строки равно 4,8095, что и возвращает AVG.
Для вычисления медианы используется трикер, и это зависит от того, какую версию SQL вы используете: https://sqlperformance.com/2012/08/t-sql-queries/median

IsaiSelvan

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

OriginalGriff

Конечно, это так! Никто не хранит данные так, как вы, потому что это такая боль, чтобы работать с ними.
Вам нужно будет найти подходящий метод для вашей версии SQL и изменить его для работы с данными на основе столбцов.
Мы не можем сделать все за вас!

IsaiSelvan

спасибо за ваш ответ, я пытаюсь найти решение для этого вопроса. Но я получаю неверное значение. у меня есть один вопрос для этого запроса. Можно ли найти медианное значение для строки, основанной на таблице?.

OriginalGriff

Да, но это не будет "готовым" решением, потому что это не то, что мы обычно делаем.
Поэтому вам придется написать свой собственный, основываясь на имеющейся у вас информации.

IsaiSelvan

Пожалуйста, помогите мне в этом.Потому что последние несколько дней я пытаюсь, но безрезультатно. Но, не используя функциональность pivot и unpivot.

OriginalGriff

Я не собираюсь писать это для тебя! :смеяться:
Мне пришлось бы потратить час на настройку тестовых данных, затем оценить, какой результат я ожидаю от них вручную, затем закодировать запрос, чтобы сделать это, затем протестировать его ... этого не произойдет: мы не делаем вам работу для вас, мы не являемся сервисом "код на заказ".

IsaiSelvan

хорошо, спасибо за ответ.

Рейтинг:
0

Maciej Los

Не ответ, а дополнительная информация...

Каков самый быстрый способ вычисления медианы? - SQLPerformance.com[^]


IsaiSelvan

Я уже пробовал этот формат. ниже приведен пример данных с запросом.

выбирать
(выберите литой(функция AVG(TotAvg * 1.0 )как decimal(6,2)) от (значения (преобразования(в десятичной системе(6,2), в)),(преобразование(десятичное число(6,2), б)),(преобразование(десятичное число(6,2), З.)),
(преобразования(в десятичной системе(6,2), г)),(преобразование(десятичное число(6,2), е)),
(преобразования(в десятичной системе(6,2), Ф)),(преобразование(десятичное число(6,2), г)),(преобразование(десятичное число(6,2), Н)),(преобразование(десятичное число(6,2), я)),
(преобразования(в десятичной системе(6,2), й)),(преобразование(десятичное число(6,2), к)),(преобразование(десятичное число(6,2), л)),(преобразование(десятичное число(6,2), м)),
(преобразования(в десятичной системе(6,2), Н)),(преобразование(десятичное число(6,2), о)),(преобразование(десятичное число(6,2), п)),(преобразование(десятичное число(6,2), м)),
(преобразования(в десятичной системе(6,2), Р)),(преобразование(десятичное число(6,2), з)),(преобразование(десятичное число(6,2), Т)),(преобразование(десятичное число(6,2), у))) как Totalavg(TotAvg))
как медиана от темпа

Я изменил упомянутую вами колонку. Помоги мне


значения столбцов-от a до u в строке.

табличное значение
============
Первый ряд - 1,5,6,7,8,2,6,3,4,5,2,1,6,5,7,8,2,7,6,2,8
Второй ряд - 1,5,6,7,8,2,2,3,2,4,2,1,4,5,9,8,2,7,6,2,8

Maciej Los

И вы хотите получить медиану для каждой строки?
В чем твоя проблема?

IsaiSelvan

Да, я хочу получить медиану для каждой строки.

Первый Ряд - 1,5,6,7,8,2,6,3,4,5,2,1,6,5,7,8,2,7,6,2,8

Фактическое значение - 4,80 (это неверно)
Ожидаемое значение - 5 (Правильный выход)

Второй Ряд - 1,5,6,7,8,2,2,3,2,4,2,1,4,5,9,8,2,7,6,2,8

Фактическое значение - 4.47 (это неверно)
Ожидаемое Значение - 4 (Правильный Выход)


Создать скрипт таблицы
===================
создать таблицу "темп" (идентификатор типа int идентичности(1,1), десятичной(6,2),б типа decimal(6,2),с десятичной(6,2),д-десятичное число(6,2),е десятичное(6,2),Ф десятичное число(6,2),г десятичное число(6,2),ч. десятичное число(6,2),я типа decimal(6,2),Ж. десятичное число(6,2),к. десятичное число(6,2),я типа decimal(6,2),м. десятичные(6,2),Н типа decimal(6,2),о десятичном(6,2)п типа decimal(6,2),вопрос десятичное число(6,2),Р десятичной(6,2 ,),
с десятичной(6,2),т. к. типа decimal(6,2),у десятичное число(6,2))

Вставить Скрипт Таблицы :
====================
вставьте в temp (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) значения (1,5,6,7,8,2,6,3,4,5,2,1,6,5,7,8,2,7,6,8)
вставьте в temp (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) значения (1,5,6,7,8,2,2,3,2,4,2,1,5,9,8,2,7,6,2,8)