Oracle SQL 関数 : MAX,MIN : データ内の最大値及び最小値を返す

 numberRet := MAX( [ALL , DISTINCT] <expr> [ OVER <分析句> ] )

MAX,MINは集計関数、または分析関数として使用します。
<expr>がNULLの項目は計算されません。また、DISTINCT指定の場合は重複行は計算されません。

例として、SUM関数で示した得意先コード、担当者コードでのグループ化をMAX,MIN関数に適応してみます。

SQL> SELECT
  2   TH.得意先コード
  3  ,SUM(TD.売上数量 * TD.売上単価) AS 売上金額
  4  ,MAX(TD.売上数量 * TD.売上単価) AS MAX売上金額
  5  ,MIN(TD.売上数量 * TD.売上単価) AS MIN売上金額
  6  FROM TT_売上 TH,TT_売上明細 TD
  7  WHERE TH.売上番号 = TD.売上番号
  8  GROUP BY TH.得意先コード
  9  ORDER BY TH.得意先コード;

得意先コード   売上金額 MAX売上金額 MIN売上金額
------------ ---------- ----------- -----------
           1    1514000      540000       78000
           2     560000      400000       40000
           3     396000      220000      176000
           4     570000      570000      570000
           5     696000      540000      156000

SQL> SELECT
  2   TH.担当者コード
  3  ,SUM(TD.売上数量 * TD.売上単価) AS 売上金額
  4  ,MAX(TD.売上数量 * TD.売上単価) AS MAX売上金額
  5  ,MIN(TD.売上数量 * TD.売上単価) AS MIN売上金額
  6  FROM TT_売上 TH,TT_売上明細 TD
  7  WHERE TH.売上番号 = TD.売上番号
  8  GROUP BY TH.担当者コード
  9  ORDER BY TH.担当者コード;

担当者コード   売上金額 MAX売上金額 MIN売上金額
------------ ---------- ----------- -----------
           1    1060000      540000       78000
           2     396000      220000      176000
           4     560000      400000       40000
           5     570000      570000      570000
           7     696000      540000      156000
           9     454000      196000       78000

6行が選択されました。

分析の例として以下に示します。
以下の例は、売上明細を商品コード毎で見て、それぞれの売上数量のMAX,MINを抽出します。
最初のSQL文は商品コードの重複表示がされますが、これは全ての売上明細の行ごとに処理されているためです。
同一商品コードは一行しか表示されないようにしたのが2番目のSQL文で、DISTINCTを商品コードに付加しています。

SQL> SELECT
  2   商品コード
  3  ,MAX(売上数量) OVER(PARTITION BY 商品コード) AS 最大売上数量
  4  ,MIN(売上数量) OVER(PARTITION BY 商品コード) AS 最少売上数量
  5  FROM TT_売上明細
  6  ORDER BY 商品コード;

商品コード 最大売上数量 最少売上数量
---------- ------------ ------------
         1            2            2
         2            1            1
         3            3            3
         4            1            1
         5            2            2
         6            1            1
         7            2            2
         7            2            2
         8            3            1
         8            3            1
         8            3            1
         9            2            1
         9            2            1
         9            2            1
         9            2            1
        10            2            2
        11            1            1

17行が選択されました。

SQL> SELECT
  2   DISTINCT 商品コード
  3  ,MAX(売上数量) OVER(PARTITION BY 商品コード) AS 最大売上数量
  4  ,MIN(売上数量) OVER(PARTITION BY 商品コード) AS 最少売上数量
  5  FROM TT_売上明細
  6  ORDER BY 商品コード;

商品コード 最大売上数量 最少売上数量
---------- ------------ ------------
         1            2            2
         2            1            1
         3            3            3
         4            1            1
         5            2            2
         6            1            1
         7            2            2
         8            3            1
         9            2            1
        10            2            2
        11            1            1

11行が選択されました。