【问题标题】:A sql query to get all the records where 5 columns are same but only one column is different用于获取 5 列相同但只有一列不同的所有记录的 sql 查询
【发布时间】:2018-05-18 16:59:03
【问题描述】:

我有这张桌子:

A   B   C   D
1  Cat XYZ 12
1  Cat XYZ 13
1  Dog XYZ 14
2  Dog ABC 15
2  Dog ABC 16
3  Cat XYZ 17

结果集:

A   B   C   D
1  Cat XYZ 12
1  Cat XYZ 13
2  Dog ABC 15
2  Dog ABC 16

我需要表中的所有此类记录,其中 A、B、C 应该相同,而 D 列可以不同。 请尽快帮助它,这就是寻求帮助的原因。

【问题讨论】:

  • 即4列

标签: sql sql-server redundancy


【解决方案1】:

你可以使用exists:

select t.* 
from table t
where exists (select 1
              from table t1
              where t1.a = t.a and t1.b = t.b and t1.c = t.c and t1.d <> t.d
              );

【讨论】:

  • @Jini You state D 可以变化
  • 嗨 Yogesh,这不会忽略所有 4 列(a、b、c、d)都相同的行。 OP 说 D 可以变化,不确定它是否必须变化才能出现在结果中。
  • @Jini Mabe 正在处理发布的数据,但根据您声明的要求。如果您有两个 3 Cat XYZ 17,您希望报告还是不报告?
  • @paparazzo 不,我不希望这样,因为它是冗余数据,并且此查询没有返回仅出现一次的记录。我得到了预期的结果。
  • 该查询不会报告两个 3 Cat XYZ 17。
【解决方案2】:

鉴于您希望某一列有所不同,您需要确定要选择的列 D 的值。

SELECT A, B, C, MAX(D) D
FROM table
GROUP BY A, B, C

在上述解决方案中,我去了 D 列的最大值

【讨论】:

  • 这不会得到与预期相同的结果
  • OP 声明一列 (D) 是不同的。因此,尽管样本数据似乎为 D 列确定了相同的值,但将所有列分组会与问题相冲突。
  • 如果你按所有列分组,那么它们将在结果中产生两个单独的行,因为 D 列不同
  • 正确。看起来我们对问题的解释不同。我的理解是,数据集包含从列 AC 相同的行,但列 D 的行不同。
  • 非常正确——现在重新阅读这个问题看起来他们甚至没有在他们的结果中包含所有潜在的分组
【解决方案3】:

如果只需要 a、b、c 值,可以使用聚合:

select a, b, c, min(d), max(d)
from t
group by a, b, c
having min(d) <> max(d);

如果您想要实际的行,那么 Yogesh 的 exists 解决方案可能是最好的方法,假设所有列值都不是 NULL

【讨论】:

    【解决方案4】:

    应该这样做。

    select * 
    from ( select a, b, c, d, 
           count() over (partition by a, b, c) cnt
           from t1
         ) t 
    where t.cnt > 1
    

    【讨论】:

      【解决方案5】:

      应该可以通过一个简单的 group by 来做到这一点

      SELECT A, B, C, D
      FROM table
      GROUP BY A, B, C, D
      

      【讨论】:

      • 没有产生预期的结果
      • 我不确定 OPs 结果集是否完整 -- A = 3 记录在哪里?
      • A = 3 不符合条件。您的回答没有产生预期的结果。
      • 基于此描述 -- I need all such records in my table where A, B, C should be same and the D column can vary
      • 对我来说已经足够清楚了。没有其他记录与 A、B、C 相同。您的查询第三次没有产生预期的结果。
      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多