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查询以查找一系列值的长度_Sql_Oracle_Oracle12c - Fatal编程技术网

SQL查询以查找一系列值的长度

SQL查询以查找一系列值的长度,sql,oracle,oracle12c,Sql,Oracle,Oracle12c,我需要一个查询,用于计算列FL\u SUCC\u EXEC中最长的不间断的后续“1”序列。对于表测试中的以下数据(行编号,fl成功执行编号(1)),查询结果应为“6” 行按行编号排序 ROW_NO FL_SUCC_EXEC ---------- ------------ 1 1 2 1 3 1 4 0 5

我需要一个查询,用于计算列
FL\u SUCC\u EXEC
中最长的不间断的后续“1”序列。对于表
测试中的以下数据(行编号,fl成功执行编号(1))
,查询结果应为“6”

行按
行编号
排序

    ROW_NO   FL_SUCC_EXEC
---------- ------------
         1            1
         2            1
         3            1
         4            0
         5            1
         6            1
         7            1
         8            1
         9            1
        10            1
        11            0                               
        12            1
        13            1
        14            1  
        15            1  
我可以在PL/SQL中实现这一点:

declare
temp_cnt pls_integer default 0;
total_cnt pls_integer default 0;
begin
for rec in (select row_no, fl_succ_exec from test order by row_no)
loop
  if temp_cnt > total_cnt
   then 
   total_cnt:=temp_cnt;
  end if;

  if rec.fl_succ_exec!=0 
  then
     temp_cnt:=temp_cnt+rec.fl_succ_exec;
  else
     temp_cnt:=0;
  end if;

end loop;
dbms_output.put_line(total_cnt);
end;

但我仍然希望SQL解决方案。是否有任何Oracle设置?

CREATE TABLE test ( row_no, fl_succ_exec ) AS
  SELECT  1, 1 FROM DUAL UNION ALL
  SELECT  2, 1 FROM DUAL UNION ALL
  SELECT  3, 1 FROM DUAL UNION ALL
  SELECT  4, 0 FROM DUAL UNION ALL
  SELECT  5, 1 FROM DUAL UNION ALL
  SELECT  6, 1 FROM DUAL UNION ALL
  SELECT  7, 1 FROM DUAL UNION ALL
  SELECT  8, 1 FROM DUAL UNION ALL
  SELECT  9, 1 FROM DUAL UNION ALL
  SELECT 10, 1 FROM DUAL UNION ALL
  SELECT 11, 0 FROM DUAL UNION ALL
  SELECT 12, 1 FROM DUAL UNION ALL
  SELECT 13, 1 FROM DUAL UNION ALL
  SELECT 14, 1 FROM DUAL UNION ALL
  SELECT 15, 1 FROM DUAL;
SELECT MAX( num_1s ) AS num_1s
FROM   (
  SELECT COALESCE(
           row_no - LAST_VALUE( CASE fl_succ_exec WHEN 0 THEN row_no END )
                      IGNORE NULLS OVER ( ORDER BY row_no ),
           ROWNUM
         ) AS num_1s
  FROM   test
);
NUM_1S
------
     6
查询

CREATE TABLE test ( row_no, fl_succ_exec ) AS
  SELECT  1, 1 FROM DUAL UNION ALL
  SELECT  2, 1 FROM DUAL UNION ALL
  SELECT  3, 1 FROM DUAL UNION ALL
  SELECT  4, 0 FROM DUAL UNION ALL
  SELECT  5, 1 FROM DUAL UNION ALL
  SELECT  6, 1 FROM DUAL UNION ALL
  SELECT  7, 1 FROM DUAL UNION ALL
  SELECT  8, 1 FROM DUAL UNION ALL
  SELECT  9, 1 FROM DUAL UNION ALL
  SELECT 10, 1 FROM DUAL UNION ALL
  SELECT 11, 0 FROM DUAL UNION ALL
  SELECT 12, 1 FROM DUAL UNION ALL
  SELECT 13, 1 FROM DUAL UNION ALL
  SELECT 14, 1 FROM DUAL UNION ALL
  SELECT 15, 1 FROM DUAL;
SELECT MAX( num_1s ) AS num_1s
FROM   (
  SELECT COALESCE(
           row_no - LAST_VALUE( CASE fl_succ_exec WHEN 0 THEN row_no END )
                      IGNORE NULLS OVER ( ORDER BY row_no ),
           ROWNUM
         ) AS num_1s
  FROM   test
);
NUM_1S
------
     6
输出

CREATE TABLE test ( row_no, fl_succ_exec ) AS
  SELECT  1, 1 FROM DUAL UNION ALL
  SELECT  2, 1 FROM DUAL UNION ALL
  SELECT  3, 1 FROM DUAL UNION ALL
  SELECT  4, 0 FROM DUAL UNION ALL
  SELECT  5, 1 FROM DUAL UNION ALL
  SELECT  6, 1 FROM DUAL UNION ALL
  SELECT  7, 1 FROM DUAL UNION ALL
  SELECT  8, 1 FROM DUAL UNION ALL
  SELECT  9, 1 FROM DUAL UNION ALL
  SELECT 10, 1 FROM DUAL UNION ALL
  SELECT 11, 0 FROM DUAL UNION ALL
  SELECT 12, 1 FROM DUAL UNION ALL
  SELECT 13, 1 FROM DUAL UNION ALL
  SELECT 14, 1 FROM DUAL UNION ALL
  SELECT 15, 1 FROM DUAL;
SELECT MAX( num_1s ) AS num_1s
FROM   (
  SELECT COALESCE(
           row_no - LAST_VALUE( CASE fl_succ_exec WHEN 0 THEN row_no END )
                      IGNORE NULLS OVER ( ORDER BY row_no ),
           ROWNUM
         ) AS num_1s
  FROM   test
);
NUM_1S
------
     6
尝试: