计算连续非空列的最大数量

时间:2014-10-27 08:50:31

标签: sql oracle

我在以下结构中有一个表格

{col_a1,  ..      ,Col_a15, Continuous_count}

这些列可能具有NULL或特定值(在col_a1到col_a15中)。

我需要查找最连续的数据集,并将计数保留在continuous_count列中。例如:

Columns: col_a1   col_a2  col_a3  col_a4  col_a5  col_a6  col_a7  Continuous_count
ROW_1:    NULL     NULL     2       2       3      NULL    2           3
ROW_2:    NULL     1        2       2       3      NULL    2           4
ROW_3:    NULL     NULL     NULL    2       3      NULL    2           2
ROW_4:    2        1        2       2       3      NULL    2           5

我无法编写查询,我写了一个,但看起来太大了很多ifs和其他的。是否有一种简单的方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

我看到的唯一方法是检查相邻列的所有组合。

我使用下面的power(1,col_ax)为任何值获取1,为null获取null。添加时,具有至少一个null结果的组合为null(因此在0中使用NVL,因为否则GREATEST将导致null)。

select mytable.*,
  greatest
  (
    nvl(power(1,col_a1), 0),
    nvl(power(1,col_a1) + power(1,col_a2), 0),
    nvl(power(1,col_a1) + power(1,col_a2) + power(1,col_a3), 0),
    nvl(power(1,col_a1) + power(1,col_a2) + power(1,col_a3) + power(1,col_a4), 0),
    nvl(power(1,col_a1) + power(1,col_a2) + power(1,col_a3) + power(1,col_a4) + power(1,col_a5), 0),
    nvl(power(1,col_a1) + power(1,col_a2) + power(1,col_a3) + power(1,col_a4) + power(1,col_a5) + power(1,col_a6), 0),
    nvl(power(1,col_a1) + power(1,col_a2) + power(1,col_a3) + power(1,col_a4) + power(1,col_a5) + power(1,col_a6) + power(1,col_a7), 0),
    nvl(power(1,col_a2), 0),
    nvl(power(1,col_a2) + power(1,col_a3), 0),
    nvl(power(1,col_a2) + power(1,col_a3) + power(1,col_a4), 0),
    nvl(power(1,col_a2) + power(1,col_a3) + power(1,col_a4) + power(1,col_a5), 0),
    nvl(power(1,col_a2) + power(1,col_a3) + power(1,col_a4) + power(1,col_a5) + power(1,col_a6), 0),
    nvl(power(1,col_a2) + power(1,col_a3) + power(1,col_a4) + power(1,col_a5) + power(1,col_a6) + power(1,col_a7), 0),
    nvl(power(1,col_a3), 0),
    nvl(power(1,col_a3) + power(1,col_a4), 0),
    nvl(power(1,col_a3) + power(1,col_a4) + power(1,col_a5), 0),
    nvl(power(1,col_a3) + power(1,col_a4) + power(1,col_a5) + power(1,col_a6), 0),
    nvl(power(1,col_a3) + power(1,col_a4) + power(1,col_a5) + power(1,col_a6) + power(1,col_a7), 0),
    nvl(power(1,col_a4), 0),
    nvl(power(1,col_a4) + power(1,col_a5), 0),
    nvl(power(1,col_a4) + power(1,col_a5) + power(1,col_a6), 0),
    nvl(power(1,col_a4) + power(1,col_a5) + power(1,col_a6) + power(1,col_a7), 0),
    nvl(power(1,col_a5), 0),
    nvl(power(1,col_a5) + power(1,col_a6), 0),
    nvl(power(1,col_a5) + power(1,col_a6) + power(1,col_a7), 0),
    nvl(power(1,col_a6), 0),
    nvl(power(1,col_a6) + power(1,col_a7), 0),
    nvl(power(1,col_a7), 0),
    0
  ) as continous_count
from mytable;