S-JIS[2010-12-29] 変更履歴

Oracleの関数

Oracleの(SQLの)関数のメモ。


関数

引数を与えて、戻り値を取得するもの。

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

ある項目の値が最大(とか最小とか最新とか)であるキー(レコード)を取得したい場合、分析関数+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]


SQLメモへ戻る / 標準関数へ行く / Oracle目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま