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

Откуда:
Сообщений: 139
Подскажите пожалуйста как правильно составить запрос.
Есть таблица из 25 столбцов. 1 - ключ (может повторятся), 2-25 это показатели измерений за каждый час. Измерения производятся не каждый час и для каждого ключа свои промежутки измерений. Если за час измерения не производились то ячейка остается NULL. Нужно посчитать среднесуточные измерения для каждого ключа.
Т.е. нужно найти среднее значение по строке. Или подскажите где подобная тема обсуждалась. В поиске не нашел.
11 сен 14, 22:53    [16566213]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
select
 t.key, b.avg_v
from
 таблица t cross apply
 (select avg(a.v) from (values (t.v1), ... (t.v4)) a(v)) b(avg_v);
11 сен 14, 23:27    [16566290]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
invm
select
 t.key, b.avg_v
from
 таблица t cross apply
 (select avg(a.v) from (values (t.v1), ... (t.v4)) a(v)) b(avg_v);
Видимо, надо учитывать не количество записей,
а продолжительность времени действия каждого измерения.
12 сен 14, 11:20    [16567261]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
invm
select
 t.key, b.avg_v
from
 таблица t cross apply
 (select avg(a.v) from (values (t.v1), ... (t.v4)) a(v)) b(avg_v);

Видимо, надо учитывать не количество записей,
а продолжительность времени действия каждого измерения.
В данном случае замеры с NULL будут проигнорированы.
12 сен 14, 11:21    [16567266]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
AVG(<показатель>) OVER (PARTITION BY CONVERT(CHAR(13), <Дата/время>, 121))




CONVERT(CHAR(13), <Дата/время>, 121) обрезание даты до часа '2014-09-12 15'
12 сен 14, 15:21    [16568970]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
Glory
Member

Откуда:
Сообщений: 104751
a_voronin
AVG(<показатель>) OVER (PARTITION BY CONVERT(CHAR(13), <Дата/время>, 121))





CONVERT(CHAR(13), <Дата/время>, 121) обрезание даты до часа '2014-09-12 15'

У ТС-а данные в столбцах, а не в строках
12 сен 14, 15:24    [16568995]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
iap,

Тогда так:

select
 t.key, b.avg_v
from
 таблица t cross apply
 (select sum(a.v)/count(a.v) from (values (t.v1), ... (t.v4)) a(v)) b(avg_v);


В этом случае будет учтены только реальные измерения.
12 сен 14, 16:23    [16569362]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Wlr-l
iap,

Тогда так:

select
 t.key, b.avg_v
from
 таблица t cross apply
 (select sum(a.v)/count(a.v) from (values (t.v1), ... (t.v4)) a(v)) b(avg_v);



В этом случае будет учтены только реальные измерения.
Это вряд ли правильно, ибо пропущенный замер соответствует, скажем, не одному часу времени, а двум.
При чём здесь вообще количество записей?
12 сен 14, 18:04    [16569800]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
invm
select
 t.key, b.avg_v
from
 таблица t cross apply
 (select avg(a.v) from (values (t.v1), ... (t.v4)) a(v)) b(avg_v);


Прошу прощения.
Второй селект не могу понять. Берем среднее значение без нулл, из ячеек v1 ... v4.
Вот: a(v) - ? и b(avg_v) - ? - не понять.
12 сен 14, 18:52    [16569929]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку средних значени.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
ncux199rus
Вот: a(v) - ? и b(avg_v) - ? - не понять.


a(v) - это алиас для подзапроса списка полей -- v это одно из полей



b(avg_v) это тоже алиас b с полем avg_v
12 сен 14, 19:18    [16570008]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить