SQL вычитать мин и макс

Я просто пытаюсь использовать функции min() и max() в выражении, например так:

SELECT WSN, MIN(TOP) - MAX(BASE) FROM PERFS GROUP BY WSN 

Но это не похоже на допустимый SQL. Мне постоянно говорят, что я не могу использовать агрегатные функции в выражении. Могу ли я получить помощь?

4 ответа

Решение

Я бросил вопрос на форум DBISAM в Elevate (не уверен, почему я не сделал этого с самого начала), и вот что они придумали:

Используйте два прохода и создайте таблицу памяти.

SELECT WSN, MAX(BASE) as MaxBase, MIN(TOP) as MinTop INTO memory FirstPass FROM PERFS GROUP BY WSN
;
SELECT (MaxBase - MinTop) as Calc FROM memory FirstPass

Спасибо за помощь, ребята.

Без платформы базы данных мы не можем сказать так много, но попробуйте это:

select wsn, top - base
from
( SELECT WSN
  ,      MIN(TOP) top
  ,      MAX(BASE) base
  FROM   PERFS
  GROUP
  BY     WSN
)

Я думаю, что фактический ответ можно найти в документации, где вы можете найти, что TOP это ключевое слово, и таблицы экранированы ",

Попробуй это:

SELECT WSN
,      MIN("TOP") - MAX(BASE)
FROM   PERFS
GROUP
BY     WSN

Лучший ответ может зависеть от того, какой тип SQL вы используете, так как обычное табличное выражение очень пригодится для этого. Я предполагаю, что TOP и BASE являются полями в таблице PERFS?

Вот мое лучшее предположение:

SELECT WSN, (select MIN(TOP) FROM PERFS GROUP BY WSN) - (select MAX(BASE) FROM PERFS GROUP BY WSN) FROM PERFS GROUP BY WSN

Редактировать: ответ Патрика, вероятно, будет лучше.

select MAX(population) - MIN(population) as value from city;

где запрос состоит в том, чтобы найти максимальное - минимальное от населения в таблице города

значение - это имя переменной, где оно может быть изменено на любое

Это работает для меня, используя Oracle. Какую СУБД вы используете?

Приведенный ниже оператор создает образец встроенной таблицы, к которой вы можете обращаться по запросу. Я предоставил пример кода здесь, который может быть запущен как есть (самостоятельно). Вы должны адаптировать его для соответствия вашей собственной схеме базы данных:

WITH TEST_DATA AS (
  SELECT 'ted' AS name, 1 as val FROM DUAL UNION ALL 
  SELECT 'ted' AS name, 2 as val FROM DUAL UNION ALL 
  SELECT 'ted' AS name, 3 as val FROM DUAL UNION ALL 
  SELECT 'sam' AS name, 5 as val FROM DUAL UNION ALL 
  SELECT 'sam' AS name, 10 as val FROM DUAL
)SELECT name, MIN(val) - MAX(val) as minmax
 FROM TEST_DATA
GROUP BY name
Другие вопросы по тегам