Oracle - 在索引块中拆分表

时间:2017-09-22 09:58:23

标签: oracle

我必须处理Oracle中的一个小问题...我有一个包含2列的表,第一列包含日期,第二列包含导入。 “import column”可以包含NULL值或非NULL值。 我想要做的是按日期列排序(这很容易:))然后在“导入列”中添加第三列的块中连续的NULL或非NULL值的块中拆分表。 例如:

Date        Import
01/01/2017  99.12
01/02/2017  18.19
01/03/2017  22.92
01/04/2017  28.10
01/05/2017  
01/06/2017  
01/07/2017  
01/08/2017  33.78
01/09/2017  20.30
01/10/2017  12.33
01/11/2017  
01/12/2017  1.68

此表应该成为

Date        Import  Block
01/01/2017  99.12   1
01/02/2017  18.19   1
01/03/2017  22.92   1
01/04/2017  28.10   1
01/05/2017          2
01/06/2017          2
01/07/2017          2
01/08/2017  33.78   3
01/09/2017  20.30   3
01/10/2017  12.33   3
01/11/2017          4
01/12/2017  1.68    5

1 个答案:

答案 0 :(得分:1)

您可以使用以下分析函数:

select d, import, sum(state_change) over (order by d) as block
  from
(
  select d, import, import_state,
         case when import_state = lag(import_state) over (order by d, import) 
              then 0 else 1 end state_change
    from
  (
    select d, import, case when import is not null then 1 else 0 end as import_state
      from t
  )
);

(注意我将DATE列重命名为D,因为DATE是保留字)。

打破它,从最里面的查询开始:

select d, import, case when import is not null then 1 else 0 end as import_state
  from t

这会添加一列import_state,当import不为空时为1,如果为空则为0。这会创建"块"但它们编号为1,0,1,0,......而不是1,2,3,4,......

下一部分将每个import_state与前一行的内容进行比较,以检查更改。当有变化时,列state_change为1,否则为0 - 所以现在每个"块"的第一行有1并且复位有0。

然后外部部分简单地将state_change值累加起来以得到所需的结果。

可能有一个更简单的解决方案!