-2

我正在努力使用 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  

在这种情况下,我想删除 OrderID 1 的条目“删除”和“删除完成”,因为它们发生在“存储中”活动之后。我想保留 OrderID 1 的所有条目,直到(包括)“存储中”。

对于 OrderID 2,情况并非如此,因此我想保留它。

4

2 回答 2

1

如果您的情况与您描述的完全一样 - 而且您确实没有相关的时间戳,以检查之前发生的事情和后来发生的事情 - 那么您可以删除所有活动为“删除”或“删除完成”且其 orderid 为的行等于具有“存储中”活动的任何行的任何订单 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')
;

于 2020-05-27T09:17:30.143 回答
0

您可以分两步删除第 1 步删除“存储中”不可用的所有记录

 DELETE FROM table t1 WHERE 
 not exists ( select 1 from table t2 where t1.id=t2.id
                                 and Activity in ('In storage')
 )

'In storage' 可用的第二步

DELETE FROM table t1 where activity in('Deletion','Deletion Complete')
于 2020-05-27T09:08:46.573 回答