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 - Fatal编程技术网

Sql 如何使用累加非空列数的额外列实现查询

Sql 如何使用累加非空列数的额外列实现查询,sql,oracle,Sql,Oracle,假设下面有一个列为空的Oracle表 所需的查询应返回数据空列以及上面的计数列,该列应记录空列不为null的累计行数,并且结果不应受order by子句的影响 此外,如何改进查询以将结果显示为下表结果集?基本上,让empty==true列保留前一个empty==false列的计数 在此处更新第二个问题的查询 WITH dates_list AS (SELECT TO_DATE('01-31-2018','MM-dd-yyyy') + ROWNUM - 1 AS DAY FROM dual

假设下面有一个列为空的Oracle表

所需的查询应返回数据空列以及上面的计数列,该列应记录空列不为null的累计行数,并且结果不应受order by子句的影响

此外,如何改进查询以将结果显示为下表结果集?基本上,让empty==true列保留前一个empty==false列的计数

在此处更新第二个问题的查询

WITH dates_list AS
  (SELECT TO_DATE('01-31-2018','MM-dd-yyyy') + ROWNUM - 1 AS DAY
  FROM dual
    CONNECT BY LEVEL <= (TO_DATE('03-31-2018','MM-dd-yyyy') - TO_DATE('01-31-2018','MM-dd-yyyy')+1)
  )
select all_date, week_date, count(case when flag is not null then 1 end) 
              over (partition by flag order by week_date) as cnt
from (
SELECT dates1.day as all_date, dates2.day as week_date, case when dates2.day is null then 0 else 1 end as flag
FROM dates_list dates1
LEFT JOIN
  (SELECT *
  FROM dates_list
  WHERE TO_CHAR(DAY,'D') NOT IN (7,1)
  ) dates2 ON dates1.day = dates2.day
)
order by all_date;

此线程中的示例表是上表中的一个简单模拟表,基本上我尝试使用所有非周末日期的索引,但是任何周末日期都应该保留上一个非周末索引0。如果没有,如果希望枚举false列,而其他值为0,则需要指定顺序的列。SQL表表示无序集,因此需要一列来指定顺序。为了方便起见,让我称之为id:

select t.*,
       (case when empty = 'false' then row_number() over (partition by empty order by id)
             else 0
        end) as count
from t;

您的第二个请求比第一个请求简单。您没有改进第一个问题的解决方案,而是编写了一个不同且更简单的查询

假设排序是通过另一列ord进行的,ord可以是数字、日期或其他形式:

select empty, 
       count(case empty when 'false' then 1 end) over (order by ord) as cnt
from   .....

1编辑您的问题并提供您想要的结果。2个SQL表表示无序集,累积表示有序。哪个栏目有这些信息?你提到空,但没有一个值是空的。@Gordon Linoff很好,我已经修改了这个问题。那个空列只是一个伪例子,因为我不想创建一个混乱的表,其中有一列是空字段,没有主键..@Dreamer。如果你有一个新问题,你应该作为一个问题而不是在评论中提问。对不起,我认为这个解决方案可能不会产生预期的结果。此处的empty==true情况的结果不保留以前记录中的计数,而是始终保留所有行的累计量,其中empty==true也使用最新的查询和解释更新问题
select t.*,
       (case when empty = 'false' then row_number() over (partition by empty order by id)
             else 0
        end) as count
from t;
select empty, 
       count(case empty when 'false' then 1 end) over (order by ord) as cnt
from   .....