当同一列中的值不匹配但不同列重复时将返回结果的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章