Как фильтровать нули на основе того, имеет ли значение столбца только одну запись или нет, T-SQL

#tsql

#tsql

Вопрос:

У меня есть набор данных, не слишком отличающийся от этого: набор данных

Или см. здесь:

 | RECORD_VALUE | RECORD_ATTRIBUTE |
| :--- | :--- |
| ABC | NULL |
| DEF | 123 |
| DEF | 456 |
| GHI | NULL |
| GHI | 789 |
  

Исходя из этой картинки, я хотел бы отфильтровать так, чтобы строка для записи «ABC» была сохранена, но чтобы запись со значением «NULL» в Col_B для записи «GHI» была удалена. В принципе, для записей, которые имеют значение, отличное от «NULL» в Col_B, мне нужны только записи со значениями. Но для записей, которые имеют только связанное значение «NULL» в Col_B, я хочу сохранить всю запись.

Я был бы признателен за любые идеи! Спасибо!

Ответ №1:

Есть несколько способов скинуть этот cat.

Один из методов заключается в том, чтобы сначала прочитать данные, чтобы получить данные с NOT NULL в Col_B, а затем снова присоединиться к таблице, чтобы получить соответствующие значения.

Однако этот подход включает в себя одно чтение данных, а затем обработку на основе этого (экономит выполнение 2 чтения таблицы).

 WITH A AS
    (SELECT Col_A, 
            Col_B, 
            MAX(Col_B) OVER (PARTITION BY Col_A) AS Max_ColB
      FROM yourtable
    )
SELECT A.Col_A, A.Col_B
FROM  A
WHERE (Max_ColB IS NULL) 
      OR (Max_ColB IS NOT NULL AND Col_B IS NOT NULL);
  

Приведенное выше находит максимальное значение Col_B для каждого значения в Col_A, которое будет равно NULL, если все значения Col_B равны NULL , иначе будет фактическое значение.

Затем основная часть сортирует их — сообщает обо всех строках, когда значение Max_ColB равно нулю, или только строки отчетов, где значение Col_B НЕ равно NULL, имеют значение Max_ColB.

Вот db<> скрипка с вашими примерами данных и результатов. Он также включает компонент CTE, выделенный (часть WITH …), показывающий его результаты.