#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 …), показывающий его результаты.