1

次のデータセットがあります

       a      b      c
      `1`     2      3
       3      6      9  
       9      2      11 

ご覧のとおり、列 a の最初の値は固定 (つまり 1) ですが、2 行目からは前のレコードの列 c の値が取得されます。

列 b の値はランダムで、列 c の値は c = a + b として計算されます

このデータを上記の形式で選択する SQL クエリを作成する必要があります。ラグ関数を使って書いてみましたが、達成できませんでした。

助けてください。

編集:bはテーブルにのみ存在しa and c、の値に基づいて計算する必要がありますb

ハヌマント

4

2 に答える 2

5
SQL> select a
  2       , b
  3       , c
  4    from dual
  5   model
  6         dimension by (0 i)
  7         measures (0 a, 0 b, 0 c)
  8         rules iterate (5)
  9         ( a[iteration_number] = nvl(c[iteration_number-1],1)
 10         , b[iteration_number] = ceil(dbms_random.value(0,10))
 11         , c[iteration_number] = a[iteration_number] + b[iteration_number]
 12         )
 13   order by i
 14  /

         A          B          C
---------- ---------- ----------
         1          4          5
         5          8         13
        13          8         21
        21          2         23
        23         10         33

5 rows selected.

よろしく、
ロブ。

于 2012-07-20T12:37:38.150 に答える
0

行間の関係がわからない場合、前の行のa and b列と現在の行の合計を計算するにはどうすればよいですか。2 つの行の関係を見つけるために、テーブルにa columnさらに 2 つ作成しました。column id and parent

parentは について説明する列でprevious rowidは行のprimary keyです。

create table test1 (a number ,b number ,c number ,id number ,parent number);

Insert into TEST1 (A, B, C, ID) Values (1, 2, 3, 1);
Insert into TEST1 (B, PARENT, ID) Values (6, 1, 2);
Insert into TEST1 (B, PARENT, ID) Values (4, 2, 3);

  WITH recursive (a, b, c,rn) AS
    (SELECT a,b,c,id rn
       FROM test1 
      WHERE parent IS NULL
    UNION ALL
     SELECT  (rec.a+ rec.b) a
             ,t1.b b
             ,(rec.a+ rec.b+t1.b) c
             ,t1.id rn
      FROM recursive rec,test1 t1
      WHERE t1.parent = rec.rn
    )
     SELECT a,b,c
      FROM recursive;

出力

  1. は、後に続くサブクエリの名前を定義WITH keywordしますrecursive

    WITH 再帰 (a、b、c、rn) AS

  2. 次に、名前付きサブクエリの最初の部分が続きます

    SELECT a,b,c,id rn FROM test1 WHERE parent IS NULL

名前付きサブクエリは、UNION ALL2 つのクエリの 1 つです。これは、最初のクエリであり、再帰の開始点を定義します。私の CONNECT BY クエリと同様に、最初のレコードが何であるかを知りたいです。

次は、最も混乱した部分です。

SELECT  (rec.a+ rec.b) a
             ,t1.b b
             ,(rec.a+ rec.b+t1.b) c
             ,t1.id rn
  FROM recursive rec,test1 t1
  WHERE t1.parent = rec.rn

これがどのように機能するかです:

  • WITH クエリ: 1. 親クエリが実行されます。

    SELECT a,b,c FROM recursive;

    • これにより、名前付きサブクエリの実行がトリガーされます。2 サブクエリの共用体の最初のクエリが実行され、再帰を開始するシード行が提供されます。

    SELECT a,b,c,id rn FROM test1 WHERE parent IS NULL

この場合のシード行は、親が null の id =1 の行になります。これ以降、シード行を「新しい結果」と呼びましょう。これは、まだ処理が完了していないという意味で新しいものです。

  • サブクエリの共用体の 2 番目のクエリが実行されます。

    SELECT (rec.a+ rec.b) a ,t1.b b ,(rec.a+ rec.b+t1.b) c ,t1.id rn FROM recursive rec,test1 t1 WHERE t1.parent = rec.rn

于 2012-07-22T12:32:55.870 に答える