Выберите минимальное и максимальное значение - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть таблица под названием «клиенты»:

id | name    | age

1  | john    | 35        
2  | paul    | 22        
3  | ana     | 26   
4  | mark    | 19   
5  | jack    | 29   

Я хочу выбрать имя и максимальный возраст, имя и минимальный возраст ... что-то вроде:

john 35 mark 19

возможно ли это?

Ответы [ 6 ]

1 голос
/ 01 ноября 2019

Приведенный ниже запрос даст вам минимальное и максимальное значения в одной строке в соответствии с запросом. Если есть несколько совпадений для мин / макс, вы получите несколько строк. В зависимости от используемого механизма SQL синтаксис для ограничения одной строкой различается.

SELECT cMax.Name, cMax.Age, cMin.Name, cMin.Age
FROM customers cMin
JOIN customers cMax ON
    cMax.Age = (SELECT MAX(Age) FROM customers)
WHERE cMin.Age = (SELECT MIN(Age) FROM customers)

Существуют различные типы объединений (например, INNER, OUTER, CROSS);однако, для вашего вопроса не имеет значения, какой вы используете.

0 голосов
/ 01 ноября 2019

Попробуйте использовать этот запрос, чтобы показать МАКС. Возраст: - select * from customers where age=(select max(age) from customers);

Чтобы показать МИН возраст, используйте следующий запрос: - select * from customers where age=(select min(age) from customers);

0 голосов
/ 01 ноября 2019

Если вы хотите, чтобы они находились в одной строке:

select cmin.*, cmax.*
from (select name, age as minage
      from customers
      order by age asc
      fetch first 1 row only
     ) cmin cross join
     (select name, age as maxage
      from customers
      order by age desc
      fetch first 1 row only
     ) cmax;

fetch first 1 row only - это стандартный синтаксис для возврата только первой строки набора результатов. Некоторые базы данных имеют специальный синтаксис, например limit или select top (1).

0 голосов
/ 01 ноября 2019

Вы можете использовать перекрестное объединение , которое поместит два результата запроса рядом друг с другом. Построение запросов Родриго:

select
  max_cust.name,
  max_cust.age,
  min_cust.name,
  min_cust.age
from (select name, age from customers where age=(select max(age) from customers)) as max_cust
cross join (select name, age from customers where age=(select min(age) from customers)) as min_cust

Возможно, это не самый эффективный вариант, но он приобретает правильную форму. Остерегайтесь перекрестных объединений, когда в таблицах нет ровно 1 строки, так как это создает декартово произведение строк в объединяемых таблицах.

0 голосов
/ 01 ноября 2019

Да, вы можете сделать это,

select name, age from customers
where age in (select max(age) 
from customers union select min (age)from customers)
0 голосов
/ 01 ноября 2019

попробуйте

    select name, age from customers where age=(select max(age) from customers) union
 select name, age from customers where age=(select min(age) from customers) 
...