我必须处理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
答案 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
值累加起来以得到所需的结果。
可能有一个更简单的解决方案!