У меня есть сценарий, в котором я изо всех сил пытаюсь написать логику. Я пробовал функции case и max, но это не работает.
У меня есть таблица, как показано ниже, с ключевыми столбцами Ref1 и Ref2. Теперь есть сценарий, в котором мне нужно заменить значение в одном столбце другим столбцом, если значение в первом столбце равно нулю, но здесь загвоздка в том, что это значение находится в другой строке, и это нужно делать только для случаев где TID в группе — 501 и 502, а TCD — 43. Внутри группы, где мы имеем TID 501 и 502 вместе с 43, не будет никакого другого идентификатора.
Например, как показано в таблице для первых двух записей внутри группы (Ref1 и Ref2), у меня есть TID со значением 501 и 502 и TCD со значениями 43. Теперь в этом случае для обеих строк TDATE имеют значения. поэтому в этом случае я могу игнорировать вторую строку и получить в качестве вывода только первую строку.
Теперь, если я возьму бывшего. строки 6 и строки 7 внутри группы (Ref1 и Ref2) у меня есть TID со значением 501 и 502 и TCD со значениями 43, но TDATE для строки 6 равно NULL , поэтому мне нужна только строка 7 в качестве вывода, а строка 6 - нужна. игнорироваться.
Теперь, если я возьму бывшего. строки 8 и строки 9 внутри группы (Ref1 и Ref2) у меня есть TID со значением 501 и 502 и TCD со значениями 43, но TDATE для строки 9 равно NULL , поэтому в любом случае нам нужно взять строку со значением TID 501 и другую строку можно игнорировать.
Остальные все записи должны прийти в том виде, в каком они есть на выходе.
Ожидаемый результат показан здесь:


для этого вы можете использовать функции CASE и ROW_NUMBER. Вот код:
WITH ranked_data AS (
SELECT
Ref1, Ref2, TID, TCD, TDATE,
ROW_NUMBER() OVER (PARTITION BY Ref1, Ref2 ORDER BY TDATE) AS rn,
COUNT(CASE WHEN TDATE IS NOT NULL THEN 1 END) OVER (PARTITION BY Ref1, Ref2) AS cnt
FROM your_table
)
SELECT
Ref1, Ref2, TID, TCD,
CASE
WHEN TDATE IS NULL AND cnt > 0 THEN (SELECT MAX(TDATE) FROM ranked_data WHERE Ref1 = rd.Ref1 AND Ref2 = rd.Ref2)
ELSE TDATE
END AS TDATE
FROM ranked_data rd
WHERE rn = 1 OR TDATE IS NOT NULL
ORDER BY Ref1, Ref2, TID;
ROW_NUMBER присваивает каждой строке уникальный номер строки.
внутри каждой группы Ref1 и Ref2.COUNT подсчитывает количество строк со значениями, отличными от NULLTDATE, в каждой группе Ref1 и Ref2.rn = 1 или строки со значениями, отличными от NULLTDATE.CASE внешнего запроса заменяет значение TDATE максимальным значением TDATE из той же группы.
COUNT(CASE WHEN TDATE IS NOT NULL THEN 1 END)также можно выразить какCOUNT(TDATE).