SQL查询逻辑

时间:2012-07-20 12:25:12

标签: sql oracle logic lag analytical

我有以下数据集

       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的值进行计算。

Hanumant

2 个答案:

答案 0 :(得分: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.

的问候,
罗布。

答案 1 :(得分:0)

在不知道行之间的关系的情况下,我们如何计算上一行a and b列与当前行a column的总和。我已在表格中再创建了两个column id and parent找到两行之间的关系。

parent是告诉我们previous row的列,而id是该行的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;

output

  1. WITH keyword为要遵循的子查询定义名称recursive

    WITH递归(a,b,c,rn)AS

  2. 接下来是命名子查询的第一部分

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

  3. 命名子查询是两个查询的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 query:1。父查询执行:

      SELECT a,b,c FROM recursive;

      • 这会触发指定子查询的执行。 2子查询的union中的第一个查询执行,给我们一个种子行,用于开始递归:

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

    在这种情况下,种子行将是id = 1,父级为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