Выберите строки, если значения двух столбцов идентичны, иначе выберите другую комбинацию в PostgreSQL 11.0 - PullRequest
0 голосов
/ 02 августа 2020

У меня есть следующая таблица в PostgreSQL. Для каждого идентификатора trial_id я хотел бы сохранить те строки, где name_split = digest_part_matched. Если для идентификатора trial_id условие name_split = digest_part_matched не выполняется, я хотел бы сохранить те строки, где name_split = normalized_name, если оно существует.

id          trial_id    intervention_name                                           name_split                             digest_part_matched  normalized_name code
98262908855 NCT02582996 acetaminophen                                               acetaminophen                          acetaminophen        acetaminophen   A
98262908855 NCT02582996 acetaminophen                                               acetaminophen                          (null)               acetaminophen    B
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    acetaminophen                          dihydroergotamine    acetaminophen+caffeine+dihydroergotamine+metoclopramide.  C
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    acetaminophen                          acetaminophen        acetaminophen   D
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    caffeine                               caffeine acetaminophen+caffeine+dihydroergotamine+metoclopramide.   E1
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    caffeine                               caffeine acetaminophen+caffeine+dihydroergotamine+metoclopramide.   E2
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    dihydroergotamine                      dihydroergotamine    acetaminophen+caffeine+dihydroergotamine+metoclopramide.  F
98262908902 NCT02582996 metoclopramide.+dihydroergotamine                           dihydroergotamine                      metoclopramide.  dihydroergotamine  F

Желаемый результат:

id          trial_id    intervention_name   name_split  digest_part_matched normalized_name
98262908855 NCT02582996 acetaminophen       acetaminophen   acetaminophen   acetaminophen  A
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    acetaminophen   acetaminophen   acetaminophen   D
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    caffeine    caffeine    acetaminophen+caffeine+dihydroergotamine+metoclopramide.   E1
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    caffeine    caffeine    acetaminophen+caffeine+dihydroergotamine+metoclopramide.   E2
98262908901 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide.    dihydroergotamine   dihydroergotamine   acetaminophen+caffeine+dihydroergotamine+metoclopramide.  F
98262908902 NCT02582996 metoclopramide.+dihydroergotamine                           dihydroergotamine                      metoclopramide.  dihydroergotamine  F

Я пытаюсь выполнить следующий запрос.

select distinct on (id, trial_id) * from tbl
where name_split = digest_part_matched

1 Ответ

0 голосов
/ 02 августа 2020

distinct on может это сделать. Я думаю, вы хотите:

select distinct on (id, trial_id) * 
from tbl
where name_split in (digest_part_matched, normalized_name)
order by 
    id, 
    trial_id,
    (name_split = digest_part_matched) desc

Третье выражение в предложении order by придает приоритет строкам, где name_split соответствует digest_part_matched.

Вы не указываете, что делать с кортежами (id, trial_id), в которых ни один из двух столбцов не соответствует name_split. Вышеупомянутый запрос просто устранит их. Запрос можно легко адаптировать для сохранения одной строки для каждой такой группы строк, при условии, что у вас есть другие критерии, чтобы решить, какая строка должна быть сохранена:

select distinct on (id, trial_id) * 
from tbl
order by 
    id, 
    trial_id,
    (name_split = digest_part_matched) desc,
    (name_split = normalized_name) desc,
    -- another criteria here
...