我有一个相当复杂的需求,我想解决在Postgres中使用SQL。我相信这在任何订单管理系统中都会得到解决,但是我找不到类似的东西。
我有下表(和值):
CREATE TABLE TABLE1 (
ID varchar(8),
ORIG_ID varchar(8),
STATUS varchar(8),
VALIDITY varchar(8)
);
INSERT INTO TABLE1
(ID, ORIG_ID, STATUS, VALIDITY)
VALUES
('1', '1', 'REPLACED','DAY'),
('2', '1', 'REPLACED','DAY'),
('3', '1', 'FILLED','DAY'),
('4', '4', 'REJECTED','DAY'),
('5', '5', 'PARTIAL','GTC'),
('6', '6', 'EXPIRED','GTD'),
('7', '7', 'REPLACED','GTD'),
('8', '7', 'PARTIAL','GTD'),
('9', '9', 'FILLED', 'GTD'),
('10', '10', 'NEW', 'DAY'),
('11', '11', 'NEW', 'GTD'),
('12', '12', 'DFD', 'GTD'),
('13', '13', 'REPLACED', 'GTD'),
('14', '13', 'FILLED', 'GTD')
;
N.B -
我的要求是:
删除状态为以下任一项的所有条目:
FILLED, EXPIRED, REJECTED, CANCELLED
PARTIAL/NEW - If the VALIDITY is not GTD/GTC (i.e. only DAY)
REPLACED - Unless there are other entries with the same ORIG_ID in a PARTIAL/NEW STATUS and not GTD/GTC (still working orders)
TBD - To Be Deleted:
TBD ('1', '1', 'REPLACED','DAY'),
TBD ('2', '1', 'REPLACED','DAY'),
TBD ('3', '1', 'FILLED','DAY'),
TBD ('4', '4', 'REJECTED','DAY'),
('5', '5', 'PARTIAL','GTC'),
TBD ('6', '6', 'EXPIRED','GTD'),
('7', '7', 'REPLACED','GTD'),
('8', '7', 'PARTIAL','GTD'),
TBD ('9', '9', 'FILLED', 'GTD'),
TBD ('10', '10', 'NEW', 'DAY'),
('11', '11', 'NEW', 'GTD'),
('12', '12', 'DFD', 'GTD'),
TBD ('13', '13', 'REPLACED', 'GTD'),
TBD ('14', '13', 'FILLED', 'GTD')
我试着找过了,我能找到的壁橱如下:
但是,在合并上述需求时,我无法让它工作。
由于这将在一天结束时运行,我有一些想法,例如更改所有的条目的有效日期,将状态设置为过期。然后,只需删除所有这些命令,但仍会遇到GTD/GTC订单的状态问题。我不确定这是否也会比在同一逻辑下处理这一切更快。
对于如何解决这个问题,任何帮助(或新想法)都将不胜感激。
发布于 2014-12-30 14:43:12
Delete from table1
WHERE status in ('FILLED','EXPIRED','REJECTED','CANCELLED')
OR (status in ('PARTIAL','NEW') AND validity not in ('GTD','GTC'))
OR (status = 'REPLACED' and orig_ID not in
(select ORig_ID from table1 where status in ('PARTIAL','NEW')));
http://sqlfiddle.com/#!15/9e465/28/0
发布于 2014-12-30 14:30:53
你的PostgreSQL版本是什么?
不管怎样,这就是我想出来的
delete from TABLE1 where
STATUS in ('FILLED','EXPIRED','REJECTED','CANCELLED') or
STATUS in (select STATUS from TABLE1 where STATUS in ('PARTIAL','NEW')
and VALIDITY!='DAY') OR
STATUS in (select status from TABLE1 where STATUS ='REPLACED'
and orig_ID not in
(select ORig_ID from table1 where status in ('PARTIAL','NEW')))
http://sqlfiddle.com/#!15/9e465/54
发布于 2014-12-30 14:40:46
除非我弄错了,否则OP中的输出有错误,或者逻辑上有错误。
DELETE
FROM TABLE1 AS T
WHERE STATUS IN ('FILLED', 'EXPIRED', 'REJECTED', 'CANCELLED')
OR ( STATUS IN ('PARTIAL', 'NEW')
AND VALIDITY NOT IN ('GTD', 'GTC') )
OR ( STATUS = 'REPLACED'
AND NOT EXISTS
(SELECT 1
FROM TABLE1 tbl1
WHERE T.ID <> tbl1.ID
AND T.ORIG_ID = tbl1.ORIG_ID
AND tbl1.STATUS IN ('PARTIAL', 'NEW')
AND tbl1.VALIDITY NOT IN ('GTD', 'GTC')
)
);
http://sqlfiddle.com/#!15/9e465/16
编辑:看来OP意味着
“替换--除非它没有GTD/GTC状态,并且有其他具有相同ORIG_ID的条目”
而不是
替换--除非有其他具有相同ORIG_ID状态的条目没有GTD/GTC状态
https://stackoverflow.com/questions/27707153
复制相似问题