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;

Это ставит NULLs в местах, где разница не соответствует условию.

Если вы хотите отфильтровать строки, используйте 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.

Другие вопросы по тегам