SQL oracle下一个值
如何为每个名称1和id获取下一个值nextname1?SQL Oracle。 我尝试使用分析函数LEAD和LAST_值,但不起作用:SQL oracle下一个值,sql,oracle,Sql,Oracle,如何为每个名称1和id获取下一个值nextname1?SQL Oracle。 我尝试使用分析函数LEAD和LAST_值,但不起作用: LEAD(name1) OVER (PARTITION BY id ORDER BY id) as nextname1 返回: id name1 (nextname1) 1 AA (AA) 2 AA (AA) 3 AA (MB) 4 MB (MB) 5 MB (BB) 6 BB (BB) 7 BB (ZZ) 8 ZZ (null)
LEAD(name1) OVER (PARTITION BY id ORDER BY id) as nextname1
返回:
id name1 (nextname1)
1 AA (AA)
2 AA (AA)
3 AA (MB)
4 MB (MB)
5 MB (BB)
6 BB (BB)
7 BB (ZZ)
8 ZZ (null)
我想:
id name1 (nextname1)
1 AA (MB)
2 AA (MB)
3 AA (MB)
4 MB (BB)
5 MB (BB)
6 BB (ZZ)
7 BB (ZZ)
8 ZZ (null)
注意:我有一个包含数百万条记录的表。不需要分析函数。使用嵌套选择:
with data as (
select 1 id, 'AA' name1 from dual union all
select 2 id, 'AA' name1 from dual union all
select 3 id, 'AA' name1 from dual union all
select 4 id, 'MB' name1 from dual union all
select 5 id, 'MB' name1 from dual union all
select 6 id, 'BB' name1 from dual union all
select 7 id, 'BB' name1 from dual union all
select 8 id, 'ZZ' name1 from dual
)
select d1.id, d1.name1, (
select name1
from data d2
where d2.id > d1.id
and d2.name1 <> d1.name1
and rownum = 1
) nextname1
from data d1
您可以通过两个步骤来完成:
SQL> WITH DATA AS (
2 SELECT 1 id, 'AA' name FROM DUAL
3 UNION ALL SELECT 2 id, 'AA' name FROM DUAL
4 UNION ALL SELECT 3 id, 'AA' name FROM DUAL
5 UNION ALL SELECT 4 id, 'MB' name FROM DUAL
6 UNION ALL SELECT 5 id, 'MB' name FROM DUAL
7 UNION ALL SELECT 6 id, 'BB' name FROM DUAL
8 UNION ALL SELECT 7 id, 'BB' name FROM DUAL
9 UNION ALL SELECT 8 id, 'ZZ' name FROM DUAL
10 )
11 SELECT v.*, max(first_step) OVER (PARTITION BY name) nextname
12 FROM (SELECT data.*,
13 nullif(lead(name) OVER (ORDER BY id), name) first_step
14 FROM data) v
15 ORDER BY id;
ID NA FI NE
---------- -- -- --
1 AA MB
2 AA MB
3 AA MB MB
4 MB BB
5 MB BB BB
6 BB ZZ
7 BB ZZ ZZ
8 ZZ
不需要嵌套选择,使用分析:@VincentMalgrat:同意。特别是因为rownum过滤器只适用于隐式排序的CTE。对于现实生活中的表,我必须对select进行双重嵌套,而这种双重嵌套不起作用,因为您无法将变量推到两级深@文森特·马尔格拉特:我知道。我在考虑另一个嵌套选择:不存在从数据d3中选择1,其中。。。。但后来我懒得把它写下来-谢谢,但我有一个包含数百万条记录的表,所以这不是一个好的解决方案:@AdamKozlowski:为什么行数是不使用此解决方案的原因?@a_horse_,没有名称好的,它可以工作。我不明白什么是数据,因为我认为你需要做所有。。。对于所有数据。现在一切正常,谢谢:-