Сравните строки в таблице postgreSQL и сохраните строку с самой длинной строкой в ​​столбце - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующая таблица в PostgreSQL 11.0

id      col1                             col2           code
3876    dexamethasone                   dexamethasone   A01AC | C05AA | D07AB | S01BA
3948    dexamethasone sodium phosphate  dexamethasone   A01AC | C05AA 
187834  dexamethasone sodium succinate  dexamethasone   H02AB | S01BA
352241  dexamethasone acetate           dexamethasone   D07AB | H02AB | S01BA
971608  dexamethasone phosphate         dexamethasone   H02AB
1010    insulin plus                    insulin         H02ABA | H02ABC
10101   paracet                         insul           H02A
10101   paracetamol                     insul           H02A

Я хотел бы сохранить строку с самой длинной строкой кода (или минимальным значением id), если значения col2 идентичны по строкам и если значения id разные. Остальные строки остаются такими же.

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

id      col1                             col2           code
3876    dexamethasone                   dexamethasone   A01AC | C05AA | D07AB | S01BA
1010    insulin plus                    insulin         H02ABA | H02ABC
10101   paracet                         insul           H02A
10101   paracetamol                     insul           H02A

Для этой проблемы у меня нет отправной точки, чтобы попробовать. Ваша помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Если я правильно следил за вами, вы можете использовать distinct on и row_number():

select distinct on (
    col2, 
    row_number() over(partition by col2, id order by id)
) t.*
from mytable t
order by
    col2, 
    row_number() over(partition by col2, id order by id),
    length(code) desc, 
    id
;
0 голосов
/ 14 июля 2020

здесь db-fiddle

with dup_ids as (
  select id
    from codes
   group by id
  having count(*) > 1
)
select distinct on (c.col2||case when d.id is null then '' else c.col1 end) c.*
  from codes c
  left join dup_ids d on d.id = c.id
 order by (c.col2||case when d.id is null then '' else c.col1 end), length(c.code) desc, c.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...