如何编写 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)
)
;
我需要删除 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)
)
;