У меня есть сценарий, в котором я изо всех сил пытаюсь написать логику. Я пробовал функции 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 и другую строку можно игнорировать.
Остальные все записи должны прийти в том виде, в каком они есть на выходе.
Ожидаемый результат показан здесь:
🤔 А знаете ли вы, что...
SQL позволяет объединять данные из разных таблиц с помощью операторов JOIN.
для этого вы можете использовать функции 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
подсчитывает количество строк со значениями, отличными от NULL
TDATE
, в каждой группе Ref1
и Ref2
.rn = 1
или строки со значениями, отличными от NULL
TDATE
.CASE
внешнего запроса заменяет значение TDATE
максимальным значением TDATE
из той же группы.