【问题标题】:SQL looking for duplicates in different columnsSQL 查找不同列中的重复项
【发布时间】:2021-02-01 23:13:33
【问题描述】:

我正在使用的表格如下所示

id_psg town_from town_to
1 Rostov Moscow
1 Rostov Paris
2 Rostov Moscow
2 Singapore London
2 Singapore London
3 London Singapore
3 London Singapore
4 Singapore London
4 London Singapore
4 Singapore London
5 London Singapore
5 London Singapore
5 Paris London

我们拥有按乘客 ID 区分的人的数据,以及他们从哪个城镇旅行。

起初,我希望找到仅从 1 个地点旅行到仅 1 个目的地的乘客 ID(无论他们这样做了多少次)。所以我按 id_psg 对表进行分组并查找重复项。这段代码实现了这个目标。

SELECT id_psg
FROM passengers
GROUP BY id_psg
HAVING COUNT(DISTINCT town_from) = 1 AND COUNT(DISTINCT town_to) = 1

我得到的结果是

|id_psg|
|------|  
|3     |

现在我正在尝试获取仅在 2 个城镇之间旅行的乘客的乘客 ID 的结果,不一定是单程,也可能是往返。结果应该是这样的。

|id_psg|
|------|  
|3     |  
|4     |

因为 ID 为 4 的乘客仅从新加坡到伦敦或从伦敦到新加坡。
这项任务需要我在 2 列而不是 1 列之间搜索重复项,这是我无法解决的问题。

【问题讨论】:

  • 合并相同的数据集与交换的tofrom 并计算tofrom 的不同contatenations。它应该等于 2。
  • 您使用的是什么 DBMS? Edit问题并添加标签。

标签: sql sql-server


【解决方案1】:

您可以取消透视数据并聚合:

select id_psg
from ((select id_psg, town_from as town
       from passengers
      ) union all
      (select id_psg, town_to as town
       from passengers
      )
     ) p
group by id_psg
having count(distinct town) = 2;

请注意,这很容易推广到更多城镇。

Here 是一个 dbfiddle。

【讨论】:

    【解决方案2】:

    你可以试试:

    SELECT id_psg
    FROM passengers
    GROUP BY id_psg
    HAVING (
            MIN(town_from) = MIN(town_to) AND
            MAX(town_from) = MAX(town_to) AND
            COUNT(DISTINCT town_from) = 2 AND
            COUNT(DISTINCT town_to) = 2 )
        OR (
            COUNT(DISTINCT town_from) = 1 AND
            COUNT(DISTINCT town_to) = 1
        );
    

    MIN/MAX 断言确保同一对城镇出现在town_fromtown_to 中。不同的计数断言确保乘客在两个方向上至少旅行了一次。或者,可以使用您当前的单程旅行标准。

    【讨论】:

    • 。 .这不会返回 id = 3。
    • 问题的语言使我们不清楚 OP 是否想要一种方式和两种方式,或者只是后者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多