我正在尝试为共享重复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
);
使用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')
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;