Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL oracle下一个值_Sql_Oracle - Fatal编程技术网

SQL oracle下一个值

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)

如何为每个名称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)
我想:

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_,没有名称好的,它可以工作。我不明白什么是数据,因为我认为你需要做所有。。。对于所有数据。现在一切正常,谢谢:-