генерация порядковых номеров в db2

#sql #db2 #numbers #sequence #db2-400

#sql #db2 #числа #последовательность #db2-400

Вопрос:

У меня есть таблица A, которая содержит 5 столбцов от col1 до col5. всего она содержит 6 строк.Я использую DB2 sql

Ниже приведены данные для col2.

 A
A
test
testasfdla
Null
Null
 

Требование:-
Если col2 содержит null, мне нужно присвоить порядковый номер, начинающийся с 1.

исключенный o / p:-

Ниже приведены данные для col2.

 A
A
test
testasfdla
1
2
 

Я попытался с помощью row_number, но не получил требуемого ввода-вывода.

Комментарии:

1. Как вы пытались с row_number() ? Как вы упорядочили данные, если это важно для вас ? Вы имеете в виду обновление столбца с помощью assign или нового производного столбца в инструкции SELECT?

2. Создайте a BEFORE INSERT TRIGGER , который будет проверять col2 наличие null и использовать a SEQUENCE для назначения увеличивающихся чисел, если это так.

Ответ №1:

Попробуйте это:

 WITH T (C) AS 
(
VALUES
  'A'
, 'A'
, 'test'
, 'testasfdla'
, Null
, Null
)
SELECT COALESCE(C, TO_CHAR(ROW_NUMBER() OVER (PARTITION BY C)))
FROM T
 

Комментарии:

1. Спасибо за ввод, и он работает. но если я удалю РАЗДЕЛ с помощью предложения C, почему я получаю выходные данные как 5 и 6. Как db2 удостоверится, что NULL присваивается последним?

2. Функция с partition предложением просто перечисляет все строки с одинаковыми значениями C независимо. Вам не нужно использовать такое перечисление для ненулевых значений с таким выражением. Поэтому не удаляйте это предложение, если вы не хотите нарушать необходимую функциональность.

3. Добавьте ПОРЯДОК ПО c desc после раздела по части C, и вы получите 1 и 2 в качестве чисел для нулей

4. @MichaelTiefenbacher Order by тот же столбец, что и в partition by предложении, бесполезен — это то же самое, что упорядочивание по константе. Для некоторых продуктов баз данных требуется order by предложение в этой функции, но не Db2.

5. @MarkBarinstein Это была опечатка при воспроизведении запроса. Хороший пример выполнения находится в db<>fiddle .