我正在努力使用Vertica SQL语句,以便在某个事件发生后删除一个OrderID的所有条目。
这是我的数据的一个表示。
**OrderID Activity**
1 Item Started
1 Task 1 complete
1 In storage
1 Deletion
1 Deletion Complete
2 Item Started
2 Deletion
2 Deletion Complete
在这种情况下,我想删除订单ID 1的条目 "删除 "和 "删除完成",因为它们发生在活动 "入库 "之后。我想保留订单ID 1的所有条目,直到(并包括)"入库"。
对于订单ID 2,情况并非如此,因此我想保留它。
如果您的情况与您所描述的完全相同--而且您确实没有相关的时间戳,无法检查之前和之后发生的事情--那么您可以删除所有活动为 "删除 "或 "删除完成 "的记录,并且其订单id等于活动为 "入库 "的任何记录的订单id。
但是,如果 "入库 "需要发生在 "删除 "或 "删除完成 "之前,那么你还需要在我下面使用的子选择中进行验证。
-- create the example table - drop any table of that name existing before ...
DROP TABLE IF EXISTS input;
CREATE TABLE input(OrderID,Activity) AS (
SELECT 1,'Item Started'
UNION ALL SELECT 1,'Task 1 complete'
UNION ALL SELECT 1,'In storage'
UNION ALL SELECT 1,'Deletion'
UNION ALL SELECT 1,'Deletion Complete'
UNION ALL SELECT 2,'Item Started'
UNION ALL SELECT 2,'Deletion'
UNION ALL SELECT 2,'Deletion Complete'
);
-- here goes
DELETE
FROM input
WHERE orderid IN (
SELECT orderid FROM input WHERE activity='In storage'
)
AND activity IN('Deletion','Deletion Complete')
;
你可以分两步进行删除 1.删除所有 "入库 "不可用的记录。
DELETE FROM table t1 WHERE
not exists ( select 1 from table t2 where t1.id=t2.id
and Activity in ('In storage')
)
第二步,其中 "存储 "可用
DELETE FROM table t1 where activity in('Deletion','Deletion Complete')