SQL-запрос для поиска строк с похожими идентификаторами, которые "не" / "имеют" шаблон во вторичном столбце - PullRequest
0 голосов
/ 18 декабря 2018

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

Представьте, что это веб-магазин, у которого есть несколько этапов для каждого заказа,Каждый orderid имеет несколько записей в таблице.

Я хочу исключить некоторые Orderid на основании их определенного шаблона.

Пример:

Orderid     Stage     OtherInfo
----------------------------------
1           step 1    random info    
1           step 3    random info
1           step 4    random info
3           step 1    random info
3           step 2    random info
5           step 3    random info
4           step 1    random info
4           step 2    random info
4           step 3    random info

Теперь я хочу запросить строки, где соответствующий OrderID соответствует критериям - как, например:

  • Был пройден «Шаг 1» и «Шаг 3» // но не«Шаг 2»

Ожидаемый результат:

Orderid      Stage     OtherInfo
-----------------------------------
1            step 1    random info
1            step 3    random info
1            step 4    random info

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Используйте EXISTS для проверки условий:

SELECT * 
FROM tablename t
WHERE
  EXISTS (SELECT 1 FROM tablename WHERE tablename.Orderid = t.Orderid AND tablename.stage = 'step 1')
  AND
  EXISTS (SELECT 1 FROM tablename WHERE tablename.Orderid = t.Orderid AND tablename.stage = 'step 3')
  AND
  NOT EXISTS (SELECT 1 FROM tablename WHERE tablename.Orderid = t.Orderid AND tablename.stage = 'step 2');
0 голосов
/ 19 декабря 2018

Вы также можете использовать

SELECT *
FROM T TT
WHERE CASE WHEN EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 1')
           THEN 
      CASE WHEN EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 3')
           THEN 
      CASE WHEN NOT EXISTS (SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 2')
           THEN 1
      END
      END
      END = 1;

ИЛИ

SELECT *
FROM T TT
WHERE CASE WHEN EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 1')
                AND
                EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 3')
                AND
                NOT EXISTS (SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 2')
           THEN 1
      END = 1;
0 голосов
/ 18 декабря 2018

Вы можете получить идентификаторы заказа, используя агрегацию и having:

select orderid
from t
group by orderid
having sum(case when stage = 'step 1' then 1 else 0 end) > 0 and
       sum(case when stage = 'step 3' then 1 else 0 end) > 0 and
       sum(case when stage = 'step 2' then 1 else 0 end) = 0;

Чтобы получить исходные строки:

select t.*
from t
where t.orderid in (select orderid
                    from t
                    group by orderid
                    having sum(case when stage = 'step 1' then 1 else 0 end) > 0 and
                           sum(case when stage = 'step 3' then 1 else 0 end) > 0 and
                           sum(case when stage = 'step 2' then 1 else 0 end) = 0
                   );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...