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

10-150 特殊な数列を作成その1

SQLパズル

データディクショナリを使って、
以下の数列を作成する

出力結果
ColA  ColB
----  ----
   1     7
   2     7
   3     7
   4     7
   5     7
   6     7
   7     7
   8     6
   9     6
  10     6
  11     6
  12     6
  13     6
  14     5
  15     5
  16     5
  17     5
  18     5
  19     4
  20     4
  21     4
  22     4
  23     3
  24     3
  25     3
  26     2
  27     2
  28     1

こちらを参考にさせていただきました(英語)


SQL

--■■■データディクショナリを使う方法■■■
select a.ColA,max(ColB) as ColB
  from (select RowNum as ColA from all_catalog a where RowNum <= 7*(7+1)/2) a,
       (select RowNum as ColB,sum(RowNum) over (order by RowNum desc) as summary
          from all_catalog
         where RowNum <=7) b
 where a.ColA <= b.summary
group by a.ColA
order by a.ColA;

--■■■model句を使う方法(10g以降)■■■
select ColA,ColB,Counter
  from dual
 model
 dimension by (1 as ColA)
 measures(0 as ColB,7 as Counter)
 rules ITERATE (28)(
 Counter[iteration_number+1] = case when iteration_number = 0 then Counter[cv()]
                                    when Counter[cv()-1]  = 1 then ColB[cv()-1]-1
                                    else Counter[cv()-1]-1 end,
 ColB[iteration_number+1] = case when iteration_number = 0 then Counter[cv()]
                                 when Counter[cv()-1]  = 1 then ColB[cv()-1]-1
                                 else ColB[cv()-1] end);


解説

数学者のガウスの考えた公式で、自然数の連番を作り、
分析関数で、等差数列の和を求めて、
結合させてます

ガウスの考えた公式(英語)
ガウスの考えた公式