当前位置: 首页 > 知识库问答 >
问题:

pgsql删除某些列(不是全部)重复的行

何聪
2023-03-14

表-col_pk、col1、col2、col3、col4、col_date_更新

此表中有些行的col2和col3列值重复。我想保持那些列的列更新为最新(max)。

如:

col_pk, col1, col2,  col3, col4,   col_date_updated
1,      A,    hello, now,  200.00, 2017-12-12 15:09:44.437546
2,      B,    hello, now,  490.00, 2017-12-12 15:09:42.437065
3,      C,    hi,    now,  300.00, 2017-12-12 15:09:41.436617
4,      D,    hello, now,  250.00, 2017-12-12 15:09:45.436617
5,      E,    hi,    now,  250.00, 2017-12-12 10:09:41.436617

预期结果:

col_pk, col1, col2,  col3, col4,   col_date_updated
3,      C,    hi,    now,  300.00, 2017-12-12 15:09:41.436617
4,      D,    hello, now,  250.00, 2017-12-12 15:09:45.436617

共有3个答案

颛孙炜
2023-03-14

你可以试试这样的。

SELECT t.*
  FROM yourtable t
 WHERE col_date_updated IN (SELECT MAX (col_date_updated)
                    FROM yourtable i
                   WHERE t.col2 = i.col2 AND t.col3 = i.col3);

所以,如果你想删除其他记录,你可以使用这个。

DELETE 
  FROM yourtable t
 WHERE col_date_updated NOT IN (SELECT MAX (col_date_updated)
                    FROM yourtable i
                   WHERE t.col2 = i.col2 AND t.col3 = i.col3);

演示

屠嘉
2023-03-14

如果您只想选择获得预期的输出,那么行数就很方便了:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY col2, col3
        ORDER BY col_date_updated DESC) rn
    FROM yourTable
)
SELECT col_pk, col1, col2,  col3, col4, col_date_updated
FROM cte
WHERE rn = 1;

如果您想删除其他记录,那么我们也可以重用CTE:

DELETE FROM yourTable WHERE col_pk IN (SELECT col_pk FROM cte WHERE rn > 1);
阳宾实
2023-03-14

看看这个。

SELECT DISTINCT ON (col2, col3) t.*
FROM table t
ORDER BY col_date_updated DESC

在col2和col3上应用不同的应用,因为你希望它们独一无二,并保持最新的订单

 类似资料:
  • 问题内容: 我正在尝试从具有相同的第一项和第三项但仅保留第一项的列表中删除列表。示例列表和输出: 由于原始列表包含数百万个列表,因此我编写的代码需要很长时间才能执行。 如何改善代码?提前致谢。 问题答案: 改进的版本: 更改为: 使用的,这使得查找更快。 转成元组,因为没有必要存储唯一的第一和第三元素列表。 减少的函数查找也可以加快代码的速度。

  • 我有下表和Postgres: 作为select查询的一部分,我希望能够基于最高的Col2值(每个Col1值永远不会有多个最高值)在Col1中删除重复项,并保留相应的Col2、Col3值。 期望输出:

  • 我有一个熊猫数据框,有4行4列-这里是一个简单的版本: 我想做的是把它转换成一个2*8的数据帧,每个数组都有B、C和D——所以它看起来像这样: 在阅读熊猫文档时,我尝试了以下方法: 但是给了我一个错误,我无法识别源(以 DataError:没有要聚合的数字类型 ) 接下来,我想根据一个值分割数据帧,但我认为.groupby命令可能会处理它

  • 问题内容: 这个问题已经在这里有了答案 : 熊猫将一些列转换为行 (4个答案) 2年前关闭。 我有一个熊猫数据框,有4行4列-这是asimple版本: 我想做的是将其转换为2 * 8数据帧,并对每个数组使用B,C和D Alligng-因此它看起来像这样: 在阅读熊猫文档时,我尝试了以下方法: 但给我一个错误,我无法识别来源(结尾为 DataError:没有要聚合的数字类型 ) 接下来,我想基于A值

  • 问题内容: 这个问题已经在这里有了答案 : 插入``值(从中选择’‘) (26个答案) 3年前关闭。 我正在使用SQL Server 2005。 我有一个3列的table1。和table2有4列。 我想将记录从表1插入到表2中。 但是我不想从table2插入column1中。 我想从column2开始插入。 我能做些什么?谢谢… 问题答案:

  • 请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得