Фильтр SQL на основе результатов SQL-запроса

#sql #postgresql

#sql #postgresql

Вопрос:

Входная таблица — t1

 make   | model | engine | kms_covered  | start   | end
-------------------------------------------------------
suzuki | sx4   | petrol | 11           | City A  | City D
suzuki | sx4   | diesel | 150          | City B  | City C
suzuki | swift | petrol | 140          | City C  | City B
suzuki | swift | diesel | 18           | City D  | City A
toyota | prius | petrol | 16           | City E  | City A
toyota | prius | hybrid | 250          | City B  | City E
  

Необходимо получить подмножество записей таким образом, чтобы start и end представляли собой только города, в diesel которых находились оба автомобиля hybrid и start в end или, или.

В приведенном выше случае ожидайте, что только город B соответствует условию, и ожидайте, что выходная таблица, как показано ниже

выходная таблица

 make   | model | engine | kms_covered  | start   | end
-------------------------------------------------------
suzuki | sx4   | diesel | 150          | City B  | City C
suzuki | swift | petrol | 140          | City C  | City B
toyota | prius | hybrid | 250          | City B  | City E
  

Двухэтапный процесс

  1. Получить список городов, в которых автомобили diesel и hybrid имеют либо в start , либо end
  2. Подмножество таблицы, содержащее только записи, содержащие города в # 1

Нужна помощь с отправной точкой, как показано ниже.

 select * from t1
 where start in () or end in ()
  

Ответ №1:

Хммм . . . Если я понимаю вопрос, вы можете получить список городов, используя CTE, а затем использовать это для решения вашего вопроса:

 with c as (
      select city
      from (select start as city, engine
            from t1
            union all
            select end, engine
            from t1
           )
      where engine in ('petrol', 'deisel')
      group by city
      having count(distinct engine) = 2
     )
select t1.*
from t1
where t1.start in (select city from c) and
      t1.end in (select city from c);