#sql #postgresql
#sql #postgresql
Вопрос:
У меня есть таблица с этими двумя столбцами
------ ------
|id |type |
------ ------
|1 |A |
------ ------
|1 |B |
------ ------
|2 |B |
------ ------
|3 |A |
------ ------
|3 |B |
------ ------
|3 |C |
------ ------
|4 |A |
------ ------
|4 |A |
------ ------
и я хочу получать строки только с повторяющимся идентификатором, который имеет значения A и B для столбца типа
Это должно выглядеть примерно так:
------ ------
|id |type |
------ ------
|1 |A |
------ ------
|1 |B |
------ ------
|3 |A |
------ ------
|3 |B |
------ ------
Я попробовал приведенный ниже запрос, который выводит строки только с повторяющимися идентификаторами, но не смог получить строки только со значениями A и B.
select id, type from table s1
where (select count(id) from table s2 where s2.id = s1.id and type in ('A', 'B')) > 1
group by id, type
order by id
Комментарии:
1. @a_horse_with_no_name не был уверен, почему это было помечено как дубликат. аналогичный вопрос на самом деле не решает эту проблему, так как мне нужны только строки с повторяющимися идентификаторами. другое решение получит строки со значениями a и b, но также получит и не повторяющийся идентификатор. кажется, я не могу объединить приведенный выше запрос (чтобы получить строки с повторяющимся идентификатором) и решение, помеченное как аналогичное, поэтому этот вопрос был опубликован.
2. @horse_with_no_name спасибо за повторное открытие. ценю это
Ответ №1:
Вы можете использовать count
аналитическую функцию следующим образом:
select id, type from
(select id, type, count(distinct type) over (partition by id) as cnt
from t where type in ('A','B')) t
where cnt = 2
Вы также можете использовать EXISTS
следующее:
select id, type from your_table t
where type in ('A','B')
and exists (select 1 from your_table tt
where t.id = tt.id
and tt.type in ('A','B')
and tt.type <> t.type)
Комментарии:
1. могу ли я спросить, что означает cnt = 2 ?
2. Мы взяли два типа в нашем запросе (
where type in ('A','B')
), а затем подсчитали различные типы для каждого идентификатора. Если count равно 2, это означает, что он имеет как A, так и B против Id3. aa хорошо. понял. Спасибо. ценю вашу помощь
4. похоже, что postgres не допускает различия после подсчета. выдает эту ошибку ОШИБКА: DISTINCT не реализован для оконных функций