#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
Двухэтапный процесс
- Получить список городов, в которых автомобили
diesel
иhybrid
имеют либо вstart
, либоend
- Подмножество таблицы, содержащее только записи, содержащие города в # 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);