SQL查询以查找具有相似ID的行,其中;不是",/&引用;是不是;在第二列中有模式

SQL查询以查找具有相似ID的行,其中;不是",/&引用;是不是;在第二列中有模式,sql,sql-server,database,powerbi,Sql,Sql Server,Database,Powerbi,我试图为共享重复ID的行编写一个查询,这些行彼此相关,但在第二列中保留特定的模式 想象一下,这是一个网络商店,每个订单都有几个阶段。每个orderid在表中都有多个条目 我想排除一些具有特定模式的Orderid 例如: Orderid Stage OtherInfo ---------------------------------- 1 step 1 random info 1 step 3 random info 1

我试图为共享重复ID的行编写一个查询,这些行彼此相关,但在第二列中保留特定的模式

想象一下,这是一个网络商店,每个订单都有几个阶段。每个
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

您可以使用聚合和
having
获取订单ID:

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
                   );

您可以使用聚合和
having
获取订单ID:

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
                   );

使用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');

使用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');
你也可以使用

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')
           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;