【问题标题】:Remove duplicates on specific rows in oracle query在 oracle 查询中删除特定行上的重复项
【发布时间】:2021-08-11 00:23:25
【问题描述】:

我一直在尝试查询 oracle 数据库并根据特定列值删除重复行,但没有取得多大成功。

我当前的 oracle 查询如下:

SELECT col1, col2, col3, col4
FROM myTable
WHERE myConditions
ORDER BY col5

问题在于,在这个查询中,col4 有几个可能的 col1/col2/col3 组合的值,我只想保留 col5 最小的值(因此查询中的 order by)。

在 pandas 中,这相当于运行此查询,然后在结果上运行 df.drop_duplicates(subset = ["col1", "col2", "col3"])。

我已经尝试使用 first_value 函数来实现这一点,但是我的 oracle 技能有限,有人知道如何修改查询以获得想要的结果吗?

以下是给定表的所需查询输出示例:

表:

  col1 col2  col3  col4  col5
0    A    A     1     3     1
1    A    A     1     5     2
2    A    A     2     2     1
3    A    A     2    -1     2
4    A    B     1     0     3
5    A    B     1     0     4
6    A    B     2     1     4
7    A    B     2     4     3

查询输出:

  col1 col2  col3  col4
0    A    A     1     3
1    A    A     2     2
2    A    B     1     0
3    A    B     2     4

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    在 Oracle 中,您可以为此使用 KEEP FIRST:

    SELECT col1, col2, col3, MIN(col4) KEEP (DENSE_RANK FIRST ORDER BY col5)
    FROM myTable
    WHERE myConditions
    GROUP BY col1, col2, col3
    ORDER BY col1, col2, col3;
    

    (顺便说一句,这里用MIN(col4)还是MAX(col4)都没有关系,因为你只期望每列col1、col2和col3都有一个最小col5的行,所以没有关系需要处理.)

    【讨论】:

      【解决方案2】:

      这能满足您的需求吗?

      SELECT distinct * FROM (
          SELECT col1, col2, col3, FIRST_VALUE(col4)  OVER (PARTITION BY col1, col2, col3 ORDER BY col5 ASC) as col4_min5
          FROM myTable
          WHERE myConditions
      ) tbl
      

      【讨论】:

      • 不完全,但输出的大小是正确的,这里对于 (col1/col2/col3) 的每个可能值,col4 的值是 myTable 中 col4 的最小值和col5 是 col4 最小的 col5 的最小值。我想要得到的是同一张表,当 col5 最小并且输出中没有 col5 时,col4 填充了它的值。
      • 啊,我明白你在找什么了。我更新了上面的代码。它是 mssql,但我认为它也应该在 oracle 中工作
      • 修改后的版本不聚合前三列;它将在输出中产生与输入中一样多的行。正确答案使用聚合函数 - first 函数,在“正确答案”中演示。
      • 不同的关键字正在执行该聚合
      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2011-08-18
      • 2019-12-11
      • 2019-03-19
      • 2016-02-21
      相关资源
      最近更新 更多