vertica—什么样的sql语句可以在某个活动发生后删除id的所有条目?

vmjh9lq9  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(374)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

11个月前关门了。
改进这个问题
在某个事件发生后,我正在努力用VerticaSQL语句删除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

在这个场景中,我想删除orderid1的条目“deletion”和“deletion complete”,因为它们发生在活动“in storage”之后。我想保留orderid1的所有条目,直到(包括)“in storage”。
对于orderid2,情况并非如此,因此我希望保留它。

k4emjkb1

k4emjkb11#

如果您的情况与您所描述的完全相同,并且您确实没有相关的时间戳来检查之前发生的事情和之后发生的事情,那么您可以删除其活动为“deletion”或“deletion complete”的所有行,并且其orderid等于具有“in storage”活动的任何行的任何order id。
但是,如果“in storage”需要在“deletion”或“deletion complete”之前发生,那么您还需要在下面使用的子选择中验证。

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

abithluo2#

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

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

相关问题