Мне нужно объединить 2 строки только в одной на основе другого имени атрибута столбца - PullRequest
1 голос
/ 25 октября 2019

Я застрял на некоторое время в этом. Представьте, что у меня есть эта таблица:

diagId | astigmatic
1      | No
1      | Yes
2      | No
3      | No
4      | No
5      | No
5      | Yes
6      | No

И я хочу вывод:

diagId | astigmatic
1      | Yes
2      | No
3      | No
4      | No
5      | Yes
6      | No

Так что, если есть diagId с Да и Нет, я хочу, чтобы кортеж Да действовал икортеж No исчезнуть.

Как мне этого добиться? Спасибо!

1 Ответ

1 голос
/ 25 октября 2019

Один метод - агрегация:

select diagid, max(astigmatic) as astigmatic
from t
group by diagid;

Это работает, потому что 'yes'> 'no'.

Или концептуально подобный метод, но, вероятно, более быстрый в Postgres:

select distinct on (diagid) t.*
from t
order by diagid, astigmatic desc;

Другой подход - or и not exists:

select t.*
from t
where t.astigmatic = 'yes' or
      (t.astigmatic = 'no' and
       not exists (select 1
                   from t t2
                   where t2.id = t.id and
                         t2.astigmatic = 'yes'
                  )
      );

Первые два метода возвращают одну строку на id - гарантировано. Этот последний метод может вернуть несколько строк, если для данного id.

имеется несколько 'yes' с или 'no' с.
...