当同一列中的值不匹配但不同列重复时将返回结果的 SQL 查询

Posted

技术标签:

【中文标题】当同一列中的值不匹配但不同列重复时将返回结果的 SQL 查询【英文标题】:SQL query that will return results when values in same column don't match, but different column duplicated 【发布时间】:2021-11-12 21:48:10 【问题描述】:

我正在尝试编写一个查询,当 ID 重复(由不同的 Type 值引起)并且代码值在重复的行中不匹配时,将为我提供 ID。只有 2 个 Type 值是可能的,因此只会有 2 个重复项。

例如:

ID Type Code
ID 1 Type 1 #####
ID 1 Type 2 #####
ID 2 Type 1 #####
ID 2 Type 2 $$$$$

我想要的数据将不包括 ID 1,因为它的代码是相同的。

我不确定仅返回代码不匹配的 ID 所需的语法和逻辑,例如我的示例中的 ID 2。我也不会在最终报告中包含类型列,因为所需的信息存在于 ID 列中。我正在使用 DISTINCT,因为我也不需要重复的行。单个 ID 完全没问题,只要它的隐形伴侣有不同的代码。这是我查询的基础:

SELECT DISTINCT id, code
FROM table
WHERE id LIKE 'ID%'
AND

这就是我所在的地方。显然,这并没有什么可做的。我不会为提出问题和学习而感到抱歉,我当然会接受有关此问题的任何和所有反馈。

我也愿意接受其他建议,例如“只需在提取所有数据后在 Excel 中执行 - 会更快”,但您必须自己解释;)谢谢!

【问题讨论】:

【参考方案1】:

按 ID 聚合并检查您是否获得多个代码(通过比较最小值和最大值或通过计数不同):

select id, min(code), max(code)
from mytable
group by id
having min(code) <> max(code)
order by id;

【讨论】:

【参考方案2】:

根据代码对 ID 进行排名,因此对于相同的代码,两行 ID 都将排名第 1,如果代码不同,则特定 ID 的行将排名第 1 和第 2。稍后我们可以过滤排名为 2 的 ID 以获得所需的结果.

with temp as(
 Select 
  ID, 
  rank() over (partition by ID order by code) as rn 
 from table_name)

select ID from temp where rn = 2

【讨论】:

以上是关于当同一列中的值不匹配但不同列重复时将返回结果的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何使用同一列中的值匹配2个表

从同一个表中的多个列中选择不同的值

当项目与数据库中的值不相等时如何取回列表的数据源

SQL如何使用同一列中的值之间匹配2个表

如果谷歌电子表格的同一列中的值重复,如何突出显示单元格?

如何对同一列中的重复值执行IF语句