SQL - сужение терминов разностным методом
У меня есть база данных SQL, к которой я пытаюсь получить доступ, мне нужно среднее значение для всех терминов, учитывая разницу между максимальным и минимальным значением каждой записи, превышающим определенный порог.
Итак, ради интереса, скажем, у нас есть следующее:
+------------+------+---------+
| Date | Name | Number |
+------------+------+---------+
| 2017-01-03 | Dude | 1000000 |
| 2017-01-03 | Dude | 2000000 |
| 2017-01-04 | Dude | 7000000 |
| 2017-01-04 | Dude | 8750000 |
+------------+------+---------+
Теперь я хочу взять средние значения для даты 2017-01-03, но только если разница между максимальным и минимальным числом для этого дня выше / ниже X. Конечно, моя фактическая таблица намного больше, поэтому удаление данных и циклы в VBA, например, это не помогает.
Мой идеальный результат будет:
+------------+------+---------+
| Date | Name | AVGnum |
+------------+------+---------+
| 2017-01-03 | Dude | X |
| 2017-01-04 | Dude | Y |
+------------+------+---------+
Где X и Y - средние значения чисел тогда и только тогда, когда разница между максимальным и минимальным значениями в этот день выше указанного значения X.
Большое спасибо!!!!
2 ответа
Что-то вроде этого:
select date, name,
(case when max(num) - min(num) > @X then avg(num) end) as avgnum
from t
group by date, name;
Это ставит NULL
s в местах, где разница не соответствует условию.
Если вы хотите отфильтровать строки, используйте having
вместо:
select date, name, avg(num) as avgnum
from t
group by date, name
having max(num) - min(num) > @X
Что -то вроде:
SELECT table.Date,
table.Name,
AVG(table.number)
FROM table
WHERE table.Date = '2017-01-03'
GROUP BY table.Date,
table.Name
HAVING MAX(table.Number) - MIN(table.Number) < X
AND MAX(table.Number) - MIN(table.Number) > X
Имейте в виду, что в расчет AVG будут взяты только числа, соответствующие условиям.
С 'HAVING' вы можете использовать агрегатные функции в GROUP BY.