Как получить только строки с повторяющимся идентификатором с определенными значениями столбца

#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 против Id

3. aa хорошо. понял. Спасибо. ценю вашу помощь

4. похоже, что postgres не допускает различия после подсчета. выдает эту ошибку ОШИБКА: DISTINCT не реализован для оконных функций