如何编写 Vertica SQL 语句来删除所有不符合条件的条目?

How do you write a Vertica SQL Statement to delete all entries that do not match a condition?

我需要删除 table 中 ID 的所有条目,其中 activity 的时间戳日期不等于 activity "item started"。

这是我的 table 的样子:

**OrderID       TimeStamp               Activity**
1   2017-10-24 18:28:44.380     Item Started
1   2017-10-24 18:08:12.867     Task 1 complete
2   2017-10-24 18:08:47.133     Item Started
2   2017-10-25 18:09:05.267     Task 1 complete

在这种情况下,我需要删除 OrderID 2 的所有条目,因为 activity "Task 1 complete" 是 25 日而不是 24 日(这是 activity "item Started".

您需要在更复杂的查询中选择列表。

你上面的描述与条件的进一步简化是一致的:

必须删除最后一个时间戳的日期不等于第一个时间戳的日期的任何 orderid 的行。

正在创建 table:

DROP TABLE IF EXISTS input;
CREATE TABLE input(orderid,ts,activity) AS (
          SELECT 1,TIMESTAMP '2017-10-24 18:28:44.380','Item Started'
UNION ALL SELECT 1,TIMESTAMP '2017-10-24 18:08:12.867','Task 1 complete'
UNION ALL SELECT 2,TIMESTAMP '2017-10-24 18:08:47.133','Item Started'
UNION ALL SELECT 2,TIMESTAMP '2017-10-25 18:09:05.267','Task 1 complete'
)
;

因此:删除最后一个时间戳的日期不等于第一个时间戳的日期的任何 orderid 的行:

DELETE FROM input
WHERE orderid IN (
  SELECT
    orderid
  FROM input
  GROUP BY
    orderid
  HAVING MAX(ts::DATE) <> MIN(ts::DATE)
)
;