Заменить ноль из другой строки

У меня есть сценарий, в котором я изо всех сил пытаюсь написать логику. Я пробовал функции 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 и другую строку можно игнорировать.

Остальные все записи должны прийти в том виде, в каком они есть на выходе.

Ссылка1 Ref2 ТИД ТЦД ДАТА 800 900 501 43 2024-12-31 800 900 502 43 2024-12-22 345 934 544 35 2023-10-23 345 934 543 36 21 ноября 2023 г. 700 876 501 43 НУЛЕВОЙ 700 876 502 43 01.01.2024 655 543 501 43 2024-04-25 655 543 502 43 НУЛЕВОЙ 434 465 411 37 2023-05-23 434 465 423 37 12.06.2024

Ожидаемый результат показан здесь:

Ссылка1 Ref2 ТИД ТЦД ДАТА 800 900 501 43 2024-12-31 345 934 544 35 2023-10-23 345 934 543 36 21 ноября 2023 г. 700 876 502 43 01.01.2024 655 543 501 43 2024-04-25 434 465 411 37 2023-05-23 434 465 423 37 12.06.2024

🤔 А знаете ли вы, что...
SQL позволяет объединять данные из разных таблиц с помощью операторов JOIN.


50
1

Ответ:

Решено

для этого вы можете использовать функции 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;
  1. Функция ROW_NUMBER присваивает каждой строке уникальный номер строки. внутри каждой группы Ref1 и Ref2.
  2. Оконная функция COUNT подсчитывает количество строк со значениями, отличными от NULLTDATE, в каждой группе Ref1 и Ref2.
  3. Внешний запрос выбирает только строки со значениями rn = 1 или строки со значениями, отличными от NULLTDATE.
  4. Оператор CASE внешнего запроса заменяет значение TDATE максимальным значением TDATE из той же группы.