トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-70 条件を満たす行に連番を設定

SQLパズル

test_table
 ENAME   SAL  DEPTNO  RANK_SAL
------  ----  ------  --------
MILLER  1300      10      null
CLARK   2450      10      null
KING    5000      10      null
SMITH    800      20      null
ADAMS   1100      20      null
JONES   2975      20      null
FORD    3000      20      null
SCOTT   3000      20      null
JAMES    950      30      null
MARTIN  1250      30      null
WARD    1250      30      null
TURNER  1500      30      null
ALLEN   1600      30      null
BLAKE   2850      30      null

DEPTNOが20以上のレコードに、
DEPTNOごとの、
SALの昇順に連番をセットする(SALが等しい場合は、ENAMEを比較)

更新結果
 ENAME   SAL  DEPTNO  RANK_SAL
------  ----  ------  --------
MILLER  1300      10      null
CLARK   2450      10      null
KING    5000      10      null
SMITH    800      20         1
ADAMS   1100      20         2
JONES   2975      20         3
FORD    3000      20         4
SCOTT   3000      20         5
JAMES    950      30         1
MARTIN  1250      30         2
WARD    1250      30         3
TURNER  1500      30         4
ALLEN   1600      30         5
BLAKE   2850      30         6


データ作成スクリプト

create table test_table as
select ENAME,SAL,DEPTNO,cast(null as number(1)) as RANK_SAL from scott.emp;


SQL

--■■■分析関数を使う方法■■■
update test_table a
set rank_sal = (select b.Rank
                  from (select c.RowID as Row_ID,
                        Row_Number() over(partition by c.DEPTNO order by c.SAL,c.ENAME) as Rank
                          from test_table c
                         where c.DEPTNO >=20) b
                 where b.Row_ID = a.RowID)
where DEPTNO >=20;

--■■■相関サブクエリを使う方法■■■
update test_table a
set rank_sal = (select count(*)+1 from test_table b
                 where b.DEPTNO = a.DEPTNO
                   and (b.SAL < a.SAL
                     or b.SAL = a.SAL and b.ENAME < a.ENAME))
where DEPTNO >=20;


解説

分析関数を使う方法では、
RowIDを使って結合させてます