powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Среднее значения без учета макс и мин!
25 сообщений из 51, страница 1 из 3
Среднее значения без учета макс и мин!
    #39763972
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, Товарищи

Задание. Найти среднее значение всех зарплат, без учета их максимального и минимального значения.

Сделал так. через MIN() MAX() OVER

SELECT AVG(sal)
FROM (SELECT sal, MIN(sal) OVER() min_sal, MAX(sal) OVER() max_sal
FROM emp) x
WHERE sal NOT IN (min_sal, max_sal)
GO


все работает. среднее значение зп выдает верное.
Решил сделать другим способом, посредством функции ROW_NUMBER.

SELECT AVG(SAL) avg_sal
FROM(SELECT sal, ROW_NUMBER() OVER(ORDER BY sal) rn
FROM emp) x
WHERE rn NOT IN ((SELECT MAX(rn) FROM emp),
(SELECT MIN(rn) FROM emp))

GO

ПО идее я выбираю все начения кроме макс и мин зарплаты. однако запрсо не работает.
подскажите на что обратить внимание, как переделать.
Ошибка в том. что в предикате WHERE нельзя использовать агрегатные функции, поидее можно сделать с HAVING.
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39763974
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermama,

Может вам медиана нужна?
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39763977
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dermama,

В итоге я отчаялся и сделал

SELECT AVG(SAL) avg_sal
FROM(SELECT sal, ROW_NUMBER() OVER(ORDER BY sal) rn
FROM emp) x
WHERE rn BETWEEN 2 AND 13
GO

и все работает верно, однако для этого запроса мне нужно посмотреть выборкой какой номер у максимального ранга. то есть потеря времени
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39763979
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

нет, именно среднюю зп без учета максимальной зп во всей таблице и минимальной
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39763981
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermamaTaPaK,

нет, именно среднюю зп без учета максимальной зп во всей таблице и минимальной
бредовая сущность, 50 000 уйдёт, а 49999 учитываем
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39763995
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача глупая, но у нее есть такое же глупое решение.
Среднее — это сумма значений, деленная на количество значений.
Нужный результат — это (сумма значений - min - max) деленная на (количество значений - 2).
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764003
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Задача глупая, но у нее есть такое же глупое решение.
Среднее — это сумма значений, деленная на количество значений.
Нужный результат — это (сумма значений - min - max) деленная на (количество значений - 2).

Нет, т.к. записей с максимальным и минимальным значением может быть больше чем по одной.
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764006
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermamadermama,

В итоге я отчаялся и сделал

SELECT AVG(SAL) avg_sal
FROM(SELECT sal, ROW_NUMBER() OVER(ORDER BY sal) rn
FROM emp) x
WHERE rn BETWEEN 2 AND 13
GO

и все работает верно, однако для этого запроса мне нужно посмотреть выборкой какой номер у максимального ранга. то есть потеря времениТак сделайте 2 ROW_NUMBER:
Код: sql
1.
2.
3.
4.
SELECT AVG(SAL) avg_sal
FROM(SELECT sal, ROW_NUMBER() OVER(ORDER BY sal) rn, ROW_NUMBER() OVER(ORDER BY sal desc) rm
     FROM emp) x
WHERE rn > 1 AND rm > 1 



TaPaKбредовая сущность, 50 000 уйдёт, а 49999 учитываемВ принципе это широко используемое в статистической науке удаление верхних и нижних выбросов, хотя делают это обычно в более общем виде, а не "удаляя одно значение".
И используется такое редко, всё таки медианное значение для подобных целей подходит лучше.
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764007
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex,

В моем случае не так, однако логика вернаю

sal
800
950
1100
1250
1250
1300
1500
1600
2450
2850
2975
3000
3000
5000
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764010
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

нормально, я бы сам не додумался до такого решения(
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764012
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermamaНайти среднее значение всех зарплат, без учета их максимального и минимального значения.
Код: sql
1.
SELECT (SUM(salary)-MIN(salary)-MAX(salary))/(COUNT(salary)-2)


dermamaвсе работает. среднее значение зп выдает верное.
Насколько верно получаемое значение, если 2 или более записей имеют равное макс. или мин. значение?
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764014
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топ топ в подзапросах
Правда совершенно непонятно, вам надо исключить все максимальные-минимальные значения или только по одноой записи?

Селект среднее
Из
Если оно не равно (максимальное из/ топ 1 ордер desc) и не равно (минимальное из/ топ 1 ордер asc)
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764016
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

и как с дублями будет жить?

Код: sql
1.
2.
3.
4.
5.
6.
; WITH t as (SELECT MIN(a) as Vmin,MAX(a) as  VMax FROM @a)
SELECT 	
	AVG(a)
FROM @a
CROSS JOIN t
WHERE a > vMin AND a < VMax
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764021
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinadermamaНайти среднее значение всех зарплат, без учета их максимального и минимального значения.
Код: sql
1.
SELECT (SUM(salary)-MIN(salary)-MAX(salary))/(COUNT(salary)-2)


dermamaвсе работает. среднее значение зп выдает верное.
Насколько верно получаемое значение, если 2 или более записей имеют равное макс. или мин. значение?
дак функция ROW_number дает уникальные значения для каждой зарплаты, не важно, сколько одинаковых значений зараплат у меня в итоговом множестве
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764023
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKalexeyvg,

и как с дублями будет жить?

Код: sql
1.
2.
3.
4.
5.
6.
; WITH t as (SELECT MIN(a) as Vmin,MAX(a) as  VMax FROM @a)
SELECT 	
	AVG(a)
FROM @a
CROSS JOIN t
WHERE a > vMin AND a < VMax

Я показал, как модифицировать запрос ТС, логика которого ТС подходит.
А то, что его запрос противоречит его же постановке задачи, это уже другое дело :-)

Для сформулированной задачи, конечено, правильным будет ваш вариант.
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764024
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dermamaAkinaпропущено...
Код: sql
1.
SELECT (SUM(salary)-MIN(salary)-MAX(salary))/(COUNT(salary)-2)


пропущено...

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

Тьфу, не туда смотрел, всеравно MAX, MIN () OVER() просто находит мне макс и мин результаты по всему множеству, и уже тоже без разницы, сколько там одинаковых значений, ну как я понимаю
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764026
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dermamadermamaпропущено...

дак функция ROW_number дает уникальные значения для каждой зарплаты, не важно, сколько одинаковых значений зараплат у меня в итоговом множестве

Тьфу, не туда смотрел, всеравно MAX, MIN () OVER() просто находит мне макс и мин результаты по всему множеству, и уже тоже без разницы, сколько там одинаковых значений, ну как я понимаю

хотяяя, необходимо проверить, так сразу не смогу сказать, я изучаю
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764028
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermamaAkinaпропущено...
Код: sql
1.
SELECT (SUM(salary)-MIN(salary)-MAX(salary))/(COUNT(salary)-2)



пропущено...

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

Вот если есть зарплаты

100
100
90
80
70
60

То запрос с ROW_number уберёт только верхнюю и нажнюю строчки, и среднее будет считаться по
100
90
80
70

А нужно, наверное, так?
90
80
70
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764035
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgdermamaпропущено...

дак функция ROW_number дает уникальные значения для каждой зарплаты, не важно, сколько одинаковых значений зараплат у меня в итоговом множествефункция ROW_number просто нумерует записи

Вот если есть зарплаты

100
100
90
80
70
60

То запрос с ROW_number уберёт только верхнюю и нажнюю строчки, и среднее будет считаться по
100
90
80
70

А нужно, наверное, так?
90
80
70

Проверил свой запрос с MIN MAX () OVER счиатем верно, находит среднеее значение 240 на 3 = 80
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764039
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dermamaalexeyvgпропущено...
функция ROW_number просто нумерует записи

Вот если есть зарплаты

100
100
90
80
70
60

То запрос с ROW_number уберёт только верхнюю и нажнюю строчки, и среднее будет считаться по
100
90
80
70

А нужно, наверное, так?
90
80
70

Проверил свой запрос с MIN MAX () OVER счиатем верно, находит среднеее значение 240 на 3 = 80

с ROW_NUMBER не првоерял, но по идее, да, по моей логике он только верхнее и нижнее значение откинет, а такоеже значение с самой большой зарплатой он оставит и я получу не верное значение..
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764043
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermamaпо идее, да, по моей логике он только верхнее и нижнее значение откинет, а такоеже значение с самой большой зарплатой он оставит и я получу не верное значение..Тогда используйте вариант:
TaPaK
Код: sql
1.
2.
3.
4.
5.
6.
; WITH t as (SELECT MIN(a) as Vmin,MAX(a) as  VMax FROM @a)
SELECT 	
	AVG(a)
FROM @a
CROSS JOIN t
WHERE a > vMin AND a < VMax
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764048
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВот если есть зарплаты

100
100
90
80
70
60

То запрос с ROW_number уберёт только верхнюю и нажнюю строчки, и среднее будет считаться по
100
90
80
70

А нужно, наверное, так?
90
80
70

если нужно последнее, то меняем Row_Number() на rank() (или dense_rank())
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764054
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermama,

посмотрите это (прямо по теме - часть 1):

YouTube Video
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764096
dermama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

всем большое спасибо, проблема с одинаковыми макс или мин значениемя поможет решить RANK так как он одинаковым значениям присвоит одинаковый ранг, чего не делает ROW_number, видео посмотрю после работы.

Однако, у меня остался вопрос, как все таки решить именно МОЙ пример через ROW_NUMBER и с обязательным условием WHERE

SELECT AVG(SAL) avg_sal
FROM(SELECT sal, ROW_NUMBER() OVER(ORDER BY sal) rn
FROM emp) x
WHERE rn NOT IN ((SELECT MAX(rn) FROM emp),
(SELECT MIN(rn) FROM emp))

GO
ТО есть как сделать с NOT IN
тоесть как изменить WHERE при этом во вложенном запросе не использовать еще один ROW_NUMBER , я имею ввиду следующий запрос

SELECT AVG(SAL) avg_sal
FROM(SELECT sal, ROW_NUMBER() OVER(ORDER BY sal) rn, ROW_NUMBER() OVER(ORDER BY sal desc) rm
FROM emp) x
WHERE rn > 1 AND rm > 1
GO
...
Рейтинг: 0 / 0
Среднее значения без учета макс и мин!
    #39764098
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dermamaс ROW_NUMBER не првоерял, но по идее, да, по моей логике он только верхнее и нижнее значение откинет, а такоеже значение с самой большой зарплатой он оставит и я получу не верное значение..
Скажите, какой ответ должен быть для таких данных:

100
100
90
85
85
70

Варианты ответов:

91.67
90
86.67
87.5
другое значение
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Среднее значения без учета макс и мин!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]