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

根据 Postgres 中的条件筛选这些行中的重复行

施景同
2023-03-14

给定一个表

CREATE TABLE data(
 irs_number VARCHAR (50),
 mop_up INTEGER,
 ou VARCHAR (50)
);

我如何返回所有匹配的记录...

  • 在另一行中至少有一个相同的irs_number值,并且
  • 具有相同irs_number的mop_up中至少有一个必须设置为 1
  • ou 值不相同,即仅返回与具有相同irs_number的行不匹配的值。

...以便返回所有< code>irs_numbers(不仅仅是条件为真的一个-参见下面的例子)。

我尝试了此操作,但查询无法在合理时间内完成:

SELECT irs_number, mop_up, ou
FROM data outer_data
WHERE (SELECT count(*)
FROM data inner_data
WHERE inner_data.irs_number = outer_data.irs_number
AND inner_data.mop_up = 1 OR outer_data.mop_up = 1
AND inner_data.ou <> outer_data.ou
);

以及此处描述的重复计数的变化:如何在PostgreSQL中查找重复记录-它们总是只返回重复记录,而不是应用的正确过滤器。

编辑:

示例数据:

INSERT INTO data VALUES 
('0001', 1, 'abc'),
('0001', 0, 'abc'),
('0001', 0, 'cde'),
('0001', 0, 'abc'),
('0002', 1, 'abc'),
('0002', 0, 'abc'),
('0003', 0, 'abc'),
('0003', 0, 'xyz')
;

SQLFiddle: http://sqlfiddle.com/#!17/be28f

理想情况下,查询应返回:

irs_number  mop_up  ou
-----------------------
0001        1       abc
0001        0       abc
0001        0       cde
0001        0       abc

(顺序不重要)这意味着它应该返回符合上述条件的< code>irs_number的所有行。

共有2个答案

严烨
2023-03-14

我认为这种连接可以:

SELECT * FROM data 
WHERE irs_number in (
  SELECT irs_number
  FROM data d
  WHERE EXISTS (SELECT 1
    FROM data 
    WHERE irs_number = d.irs_number
    AND (mop_up = 1 OR d.mop_up = 1)
    AND ou <> d.ou
  )
)

查看演示

穆宾白
2023-03-14

您应该能够使用一个简单的存在子句来执行此操作:

SELECT irs_number, mop_up, ou
FROM data d
WHERE EXISTS (SELECT 1
              FROM data d2
              WHERE d2.irs_number = d.irs_number AND
                    d2.mop_up = 1 AND
                    d2.ou <> d.ou
             );

编辑:

上面曲解了问题。它假设< code>mop_up = 1需要在不同的< code>ou上。当我阅读这个问题时,这是模糊的,但似乎不是你想要的。因此,有两个< code >存在地址:

SELECT irs_number, mop_up, ou
FROM data d
WHERE EXISTS (SELECT 1
              FROM data d2
              WHERE d2.irs_number = d.irs_number AND
                    d2.mop_up = 1
             ) AND
     EXISTS (SELECT 1
              FROM data d2
              WHERE d2.irs_number = d.irs_number AND
                    d2.ou <> d.ou
             );

这是一个数据库

这两种解决方案都能够利用上的索引(irs_number,mop_up,ou)

 类似资料:
  • 我有以下表在PostgreSQL 11.0 我想过滤上表,这样,如果col2和col4相等,只应选择此匹配项,并排除下面两行。当col2和col4不相等时,应该保留col2=col3的行。 所需的输出是: 我正在尝试下面的问题,到目前为止没有成功。 但这将包括已经有匹配的行,我希望在最终输出中排除这些行。

  • 这似乎很简单,但我似乎无法理解。我知道如何将pandas数据帧过滤到满足条件的所有行,但当我想要相反的结果时,我总是会遇到奇怪的错误。 这是一个例子。(上下文:一个简单的棋盘游戏,棋子在网格上,我们试图给它一个坐标,并返回所有相邻的棋子,但不是实际坐标上的实际棋子) 我认为应该只是否定后面括号中的布尔值,但这似乎不是它的工作方式。 我想让它在5,6时归还母牛,而不是在5,7时归还狼(因为这是当前的

  • 编辑2019:此问题是在2016年11月,当前方法和以前方法的接受答案如下。 我有一个<code>数据。表约有250万行的表。有两列。我想删除两列中重复的任何行。之前的数据。帧我会这样做:<code>df- 有什么建议吗? 干杯,戴维 例 在上面的data.table中,其中< code>V2是表键,只有第4、7和10行将被删除。

  • 我想在指定的时间戳范围内从数据帧中选择行的子集。 下面是我所做的,但它似乎没有工作。我正在尝试选择发生在01/01/2019 01:00和01/01/2021 01:00之间的行子集。 非常感谢。

  • 我想对两列使用不同的条件来聚合行。 当我做,我得到输出1 当我做时,我得到输出2 是否有一种方法可以进行聚合,将输出1显示到,将输出2显示到?

  • 让我们假设我的数据frame如下所示: 我有一个的列表,我想从Dataframe中删除它们。该列表超过200个长度,因此多个筛选器太麻烦了。 是否可以通过传递的列表来进行筛选?