1

我有以下数据集

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

如您所见,a 列的第一个值是固定的(即 1),但从第二行开始,它会获取上一条记录的 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与当前行的总和a column。我column id and parent在表中创建了另外两个来查找两行之间的关系。

parent是告诉我们关于 的列previous row,并且idprimary 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 ALL两个查询之一。这是第一个查询,定义了递归的起点。在我的 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

在这种情况下,种子行将用于 id =1 且 parent 为 null。让我们从这里开始将种子行称为“新结果”,在我们尚未完成处理它们的意义上是新的。

  • 子查询联合中的第二个查询执行:

    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 回答