これが Oracle ではなく MySQL で機能する理由は、Oracle では、他のほとんどのデータベースと同様に、group by
句でフィールド (または式) を指定する必要があるか、または次の値を組み合わせた集計である必要があるためです。グループ内のすべての値を 1 つの値にします。たとえば、これはうまくいきます:
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
の一部の関数を使用して、各従業員の数値を生成し、それを使用してフィルター処理できます。以下の例では、このようなカウンターをロケーションごとに作成し (partition by)、並べ替えました (この場合は name と id)。他のフィールドも指定できます。たとえば、場所ごとに年齢ごとに 1 つの名前が必要な場合は、年齢と場所の両方を で指定します。各場所の最も古い従業員が必要な場合は、代わりにandを削除できます。dense_rank
row_number
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