SQL查询以查找具有相似ID的行,其中;不是",/&引用;是不是;在第二列中有模式
我试图为共享重复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
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;
或