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

Откуда:
Сообщений: 111
Существует ли стандартная функция, выдающая не мин и макс из имеющихся значений, а ближайшее к среднему от мин и макс выборки? То есть. Есть у меня ограничение на период дат у пациента, мне нужно выбрать из имеющихся ближайшую к среднему от указанных ограничений. Может сталкивался кто) Желательно пюр тскуль. Отчетик следующий "После начала события через 12 мес проверить показатель анализа такой-то, в промежутке +-3 мес от событие+12 мес".
9 июл 15, 16:15    [17873333]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
AVG ?
9 июл 15, 16:21    [17873369]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Кролик-зануда
Guest
Maxx,

подозреваю, что речь скорее всего про медиану
9 июл 15, 16:23    [17873379]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
o-o
Guest
у вас никакой не агрегат.
1. avg1 = (max(dt) - min(dt)) / 2
2. dt where dt = min (abs (dt - avg1))
9 июл 15, 16:27    [17873402]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
T-SQL
9 июл 15, 16:30    [17873417]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
GlassMorre
Существует ли стандартная функция, выдающая не мин и макс из имеющихся значений, а ближайшее к среднему от мин и макс выборки?
Не-а... ибо востребованность такой функции близка к нулю.
9 июл 15, 16:37    [17873449]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
GlassMorre
Member

Откуда:
Сообщений: 111
Жалко. Не могу придумать, как это выразить скриптом. Функцию писать как то неспортивно.
9 июл 15, 18:11    [17873976]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
GlassMorre
Жалко. Не могу придумать, как это выразить скриптом. Функцию писать как то неспортивно.
А что сложного? Ищете медиану (как выше написали).
Потом от неё берёте длижайшие значения.
Потом из них берёте то, что ближе.

Пишете это всё вложенными запросами, по моему, ничего сложного.

А, вот o-o уже прямо и код написал, пропустили?
9 июл 15, 18:26    [17874051]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
select top 1 val 
from table
order by abs(val + val - (select max(val)+min(val) from table)) asc
9 июл 15, 18:28    [17874059]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Ну или типа того - смотря что называется "среднее".
9 июл 15, 18:30    [17874067]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Может вас просто подойдет STDEV()/STDEVP() ?
10 июл 15, 09:56    [17875402]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
Может вас просто подойдет STDEV()/STDEVP() ?
На всякий случай:
STDEV и STDEVP в BOL не нашел формул
10 июл 15, 10:10    [17875442]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
GlassMorre
Member

Откуда:
Сообщений: 111
В том то и дело, что нужна дата из имеющегося диапазона, а не вычисляемое. Вот, скорее у Акины куна. Сейчас пойдем пробовать. Хотя чуется мне, быстродействие будет волшебным)
13 июл 15, 15:11    [17885889]     Ответить | Цитировать Сообщить модератору
 Re: Агрегатная функция для среднего значения?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Если быстродействие будет зашкаливать - попробуйте вот это.

declaRe @__TEMP table(Data datetime)
insert @__TEMP(Data)
select CONVERT(datetime, Data, 127)
from (values('2015-01-01'), ('2015-02-01'), ('2015-03-01'), ('2015-03-01'), ('2015-03-01'), ('2015-06-01'), ('2015-07-01'), ('2015-08-01'), ('2015-01-09'), 
            ('2015-10-01'), ('2015-11-01'), ('2015-12-01'), ('2015-12-05'), ('2015-12-10'), ('2015-12-15'), ('2015-12-20'), ('2015-12-25'), ('2015-12-20') ) as t(Data)
            
select 
--- смотрим какая дата ближе к середине
case when tp1.Left_Data  IS NULL then tp2.Right_Data 
     when tp2.Right_Data IS NULL then tp1.Left_Data
     when DATEDIFF(DAY, tp1.Left_Data, t.Avg_Data) <= DATEDIFF(DAY, t.Avg_Data, tp2.Right_Data) then tp1.Left_Data else tp2.Right_Data end Avg_Real
from(select min(t.Data) + (datediff(day, min(t.Data), MAX(data))+1)/2  Avg_Data from @__TEMP t /* находим среднее значение */ ) t
outer apply(select max(t1.Data) Left_Data
			from @__TEMP t1
			where
					t1.Data <= t.Avg_Data /*находим дату слева*/ ) tp1
outer apply(select min(t1.Data) Right_Data
			from @__TEMP t1
			where
					t1.Data >= t.Avg_Data /*находим дату справа*/ ) tp2
13 июл 15, 19:46    [17887339]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить