【问题标题】:How do you write a Vertica SQL Statement to delete all entries that do not match a condition?如何编写 Vertica SQL 语句来删除所有不符合条件的条目?
【发布时间】:2020-05-14 14:35:52
【问题描述】:

我需要删除表中某个 ID 的所有条目,其中活动的时间戳日期不等于活动“项目开始”的时间戳日期。

这是我的桌子的样子:

**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 的所有条目,因为“任务 1 完成”活动的日期是 25 日而不是 24 日(这是活动“项目开始”的日期。

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

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

    您上面描述的内容与条件的进一步简化一致:

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

    创建表:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2014-05-12
      • 1970-01-01
      • 2017-02-03
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多