我有以下数据集
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
。
哈努曼
我有以下数据集
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
。
哈努曼
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.
问候,
罗布。
在不知道行之间的关系的情况下,我们如何计算前一行列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;
WITH keyword
定义recursive
要遵循的子查询的名称
WITH 递归 (a, b, c,rn) AS
接下来是命名子查询的第一部分
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;
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