2014-10-27 3 views
1

У меня есть таблица в следующем structureLCount максимальное количество непрерывных не нулевых столбцов

{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 

Я не могу написать запрос, я написал один, но выглядит слишком большой с большим количеством КСФ и другого. есть простой способ сделать это.

+0

Необходимость сделать это, вероятно, указывает на то, что они предназначены как строки, а не столбцы ... Тогда будет достаточно простого 'count (*)'. – Ben

+0

, например, в вашей таблице, вам нужно отобразить только «ROW_4' –

+0

. На основе count я получаю столбец constant_count, который является последним столбцом. Я не могу просто взять счетчик (*), потому что он вернет все ненулевые столбцы. Я этого не хочу. – vik123

ответ

1

Единственный способ, который я вижу, - проверить все комбинации соседних столбцов.

Я использую power(1,col_ax), чтобы получить 1 для любого значения и 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; 
+0

Это не повлияет на производительность, если я выполняю этот запрос на полмиллиона записей. – vik123

+0

Ну, задача немного сложная, поэтому для поиска нужных значений требуется определенная работа. Однако таблица читается только один раз, поэтому все это не должно быть слишком медленным. Чтобы не использовать функцию POWER снова и снова, вместо нее вы можете использовать производную таблицу: 'from (выберите power (1, col_a1) as has1, power (1, col_a2) as has2, ... from mytable)'. –

+0

Другой вариант - написать PL/SQL-функцию. Но вызов PL/SQL из SQL также не является бесплатным. –

Смежные вопросы