SQL Выберите только одну строку на основе условия для полного статуса в двух строках - PullRequest
1 голос
/ 14 апреля 2020

Я работаю в логистике и пытаюсь выбрать строку данных на основе условия, для которого требуется вторая строка, но затем исключить ее в качестве результата.

Например, мы организовали поставки в логистике - есть ветка поездки и шаттл, которые представляют собой уникальную строку в моих данных, но соединены ключом партии. Я только хочу выбрать этап отключения в данных, но только если оба этапа завершены.

Shipment id / Batch key / Leg type / Status
1 / 22 / Trip / Complete
2 / 22 / Shuttle / Complete

Вывод (только если оба состояния этапа завершены, в противном случае данные исключаются)

1 / 22 / Trip / Complete

Любые идеи / поддержка будут полезны.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Как насчет exists?

select t.*
from t
where t.legtype = 'Trip' and
      t.status = 'Complete' and
      exists (select 1
              from t t2
              where t2.batchkey = t.batchkey and
                    t2.legtype = 'Shuttle' and
                    t2.status = 'Complete'
             );

Или агрегации:

select min(shipment_id), batchkey, max(legtype), max(status)
from t
where legtype = ('Trip', 'Shuttle')
group by batchkey
having count(*) = 2;

Или даже самостоятельного объединения:

select tt.*
from t tt join
     t ts
     on tt.batchkey = ts.batchkey and
        tt.legtype = 'Trip' and
        tt.status = 'Complete' and
        ts.legtype = 'Shuttle' and
        ts.status = 'Complete' ;
0 голосов
/ 14 апреля 2020

Вы можете фильтровать полные поездки и использовать exists, чтобы убедиться, что для того же batch_key с полным челноком существует другая запись:

select t.*
from mytable t
where 
    t.leg_type = 'Trip'
    and t.status = 'Complete'
    and exists (
        select 1 
        from mytable t1 
        where 
            t1.batch_key = t.batch_key 
            and t1.leg_type = 'Shuttle'
            and t1.status = 'Complete'
    )
...