引数を与えて、戻り値を取得するもの。
| DUMP | dump() | 値の詳細 | 2008-06-23 |
| 文字列→日付 | to_date() | 日付変換 | |
| 文字化 | to_char() | 日付や数値を文字列に変換 | 2010-12-29 |
| 大文字化 | upper() | ||
| 数値化 | to_number() | 数値変換 | |
| 数値判断関数 | IS_NUMBER() | 文字列が数字かどうかの判断 | 2010-08-31 |
複数レコード(行)の集計を行う関数。
ある項目を合計したり、件数を数えたり。
| 件数を数える(カウントする) | count() | 2010-01-27 |
| 項目の値を集計する | sum() | |
| 項目の最小値・最大値を取得する | min()・max() | 2010-07-19 |
| 先頭・末尾(Oracleには無い) | first()・last() |
COUNT以外の集計関数は、対象となった値が全てNULLだった場合はNULLを返す。
それ以外の場合は何らかの値を返す。
COUNTは、対象が1件も無かった場合は0を返す。
SQL> select count(*), sum(1) from dual;
COUNT(*) SUM(1)
---------- ----------
1 1
SQL> set null null
SQL> select count(*), sum(1) from dual where 1=0; --1件も取れない
COUNT(*) SUM(1)
---------- ----------
0 null
集計関数と似ている。
| OVER | 分析関数() over | 2008-01-19 |
| 最小値の取得 | min() over | |
| 最大値の取得 | max() over | |
| 自分の前のレコードの値を取得 | lag() over | |
| 自分の後(次)のレコードの値を取得 | lead() over | |
| 先頭n件のselect | rownum, row_number() over | 2008-01-27 |
ある項目の値が最大(とか最小とか最新とか)であるキー(レコード)を取得したい場合、分析関数+OVERが使える。[2007-10-15]
普通の方法だと、副問い合わせと結合を使って同じテーブルを2回読み込む。
select b.* from
(
select
KEY,
max(TARGET) as MAX_TARGET
from
TABLE
group by KEY
) a,
TABLE b
where b.KEY = a.KEY AND b.TARGET = a.MAX_TARGET
;
集計関数と同名であるMAXやMINといった分析関数ではOVERというオプション(?)を使って特定範囲の値を取得できる。
select * from
(
select
KEY,
DATA1, DATA2, …,
TARGET,
max(TARGET) over(partition by KEY) as MAX_TARGET
from TABLE
)
where TARGET = MAX_TARGET
;
これも副問い合わせを使っているように見えるが、テーブルが1回しかスキャンされないので効率いいらしい。
副問い合わせ内で、テーブルの項目と、そのキー内で特有(最大値)の項目(MAX_TARGET)を追加したレコードをSELECTしている。
外側の問い合わせのWHEREで、1レコード内のTARGETとMAX_TARGETが等しいデータだけを抽出している。
したがって、同じ最大値のレコードが2つあったら、1レコードだけを特定することは出来ない。
参考: ORACLE HURRICANE MIXERさんのSQL調査報告一覧 > 集計関数と分析関数の MAX( ) を検証
→row_number関数+overを使う方法 [2008-01-19]