Причина, почему это работает в MySQL, а не в Oracle, потому, что в Oracle, а также m других баз данных, вам нужно указать поле (или выражение) в предложении group by
, или оно должно быть агрегацией, которая объединяет значения всех значений в группе в одну. Например, это будет работать:
select max(emp_name),emp_location
from Employee
where emp_age=25
group by emp_location
Однако это может быть не лучшее решение. Он будет работать, если вы хотите просто имя, но у вас возникнут проблемы, если вы хотите иметь несколько полей для сотрудника. В этом случае max
не будет делать трюк. В запросе ниже вы можете получить имя, не совпадающее с фамилией.
select max(emp_firstname), max(emp_lastname), emp_location
from Employee
where emp_age=25
group by emp_location
В решении для этого используется функция окна (аналитическая функция). С их помощью вы можете генерировать значение для каждой записи без немедленного сокращения количества записей. Например, с помощью оконной функции max
вы можете выбрать максимальный возраст для людей с именем John
и отобразить это значение рядом с каждым Джоном в результате, даже если у них нет такого возраста.
Некоторые функции, такие как rank
, dense_rank
и row_number
, могут использоваться для создания номера для каждого сотрудника, который затем можно использовать для фильтрации. В приведенном ниже примере я создал такой счетчик для каждого места (раздел by by) и упорядочил по этому имени и id. Вы также можете указать другие поля, например, если вам нужно одно имя по возрасту на место, то укажите возраст и местоположение в partition by
. Если вы хотите старейшего сотрудника каждого места, вы можете удалить where emp_age=25
и order by emp_age desc
.
select
*
from
(select
emp_name, emp_location,
dense_rank() over (partition by emp_location order by emp_name, emp_id) as emp_rank
from Employee
where emp_age=25)
where
emp_rank = 1
'group by emp_location.' То, что? –
«* в зависимости от возраста *» - там нет возраста колонки, ни дата столбца рождаемости в вашем примере –
Iam извините, запрос «выберите emp_name, emp_location от Работника где emp_age = 25 группы по emp_location – sriramdev