【问题标题】:Best way in SQL to eliminate result rows with the same $ value but a day apartSQL 中消除具有相同 $ 值但相隔一天的结果行的最佳方法
【发布时间】:2021-07-21 21:54:38
【问题描述】:

我有一个如下所示的 Oracle 表

Region Location $ Amount Date Name
1 Location1 500 2021-01-01 UserA
1 Location1 -500 2021-01-02 UserA
2 Location2 700 2021-01-03 UserB

我想查找并删除所有列都匹配的行,但日期为 1 天且 $ 金额相反。在此示例中,我想删除第 1 行和第 2 行,因为它们的 $ 金额相反,并且只有一天休息。

感谢任何帮助

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    你可以使用:

    DELETE FROM table_name t
    WHERE EXISTS (
      SELECT 1
      FROM   table_name x
      WHERE  x.region = t.region
      AND    x.location = t.location
      AND    x.amount = -t.amount
      AND    x."DATE" IN (t."DATE" - 1, t."DATE" + 1)
      AND    x.name = t.name 
    )
    

    注意:DATE 是关键字,除非使用带引号的标识符,否则不能将其用作列名。

    db小提琴here

    【讨论】:

      【解决方案2】:

      这和你描述的一样:

      select t.*
      from t
      where not exists (select 1
                        from t t2
                        where t2.region = t.region and
                              t2.location = t.location and
                              t2.name = t.name and
                              t2.amount = - t.amount and
                              t2.date in (t.date - 1, t.date + 1)
                       );
      

      但是,您可能想考虑一下您是如何表述问题的。如果你有 100/-100/100 会发生什么?您描述的逻辑(以及上述查询)将删除所有三行。这可能是你想要的。但是,如果不是,您应该问一个新的问题。

      注意:以上内容从结果集中删除了行。为delete 修改这个很容易。

      【讨论】:

      • 感谢您的意见。你提出了一个很好的观点,我认为我的数据不应该是可能的,但我会调查以确保
      猜你喜欢
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多