У меня есть таблица с 32 столбцами в таблице Oracle.
- Два из этих столбцов являются столбцами идентификаторов
- остальные значения
Я хотел бы получить среднее значение для всех столбцов значений, что усложняется нулевыми (идентичными) столбцами. Ниже приведен псевдокод того, чего я пытаюсь достичь:
SELECT
((nvl(val0, 0) + nvl(val1, 0) + ... nvl(valn, 0))
/ nonZero_Column_Count_In_This_Row)
Так, что: nonZero_Column_Count_In_This_Row = (ifNullThenZeroElse1 (val0) + ifNullThenZeroElse1 (val1) ... ifNullThenZeroElse (valn))
Сложность здесь состоит в том, чтобы получить 1 для любого ненулевого столбца. Кажется, мне нужна функция, похожая на NVL, но с предложением else. Нечто, возвращающее 0, если значение равно нулю, и 1, если нет, а не само значение.
Как мне узнать значение знаменателя?
PS: я чувствую, что должен объяснить некоторые мотивы этого дизайна. В идеале эта таблица была бы организована как столбцы идентификаторов и одно значение в строке с некоторым идентификатором для самой строки. Это сделало бы его более нормализованным, и решение этой проблемы было бы довольно простым. Причинами, по которым этого не следует делать, являются пропускная способность и экономия места. Это огромная БД, куда мы вставляем 10 миллионов значений в минуту. Создание каждого из этих значений одной строкой будет означать 10 миллионов строк в минуту, что определенно недостижимо. Упаковка 30 из них в одну строку уменьшает количество вставляемых строк до того, что мы можем сделать с одной БД, а объем служебных данных (идентификационных данных) намного меньше.