我有以下数据
NUMBER SEQUENCE_NUMBER
CA00000045 AAD508
CA00000045 AAD508
CA00000046 AAD509
CA00000047 AAD510
CA00000047 AAD510
CA00000047 AAD511
CA00000048 AAD511
,我想找出哪些行不符合以下规则:
当SEQUENCE_NUMBER相同时,NUMBER将始终相同。
因此,在上述数据中,“ AAD508”将表示SEQUENCE_NUMBER中出现相同值的每一行上的NUMBER值都是相同的。
我想纠正一个查询,该查询将使我返回此规则所在的行 破碎。例如:
CA00000047 AAD511
CA00000048 AAD511
我不知道从哪里开始,所以恐怕没有初始SQL。
谢谢
答案 0 :(得分:1)
您想对数据进行自我连接,以将每一行与共享同一序列号的所有其他行进行比较,然后使用with语句进行过滤,以仅获取具有不匹配数字的行。您没有为表格指定名称,因此我在下面将其添加为“ table_name”
SELECT
a.NUMBER,
a.SEQUENCE_NUMBER
FROM table_name a
INNER JOIN table_name b
ON a.SEQUENCE_NUMBER = b.SEQUENCE_NUMBER
WHERE a.NUMBER <> b.NUMBER
GROUP BY 1,2
加入分组以扮演不同的角色
答案 1 :(得分:0)
我只会使用exists
:
select t.*
from t
where exists (select 1
from t t2
where t2.sequence_number = t.sequence_number and
t2.number <> t.number
);
如果sequence_numbers()
最多只有两行,则可以将每个违反规则的人放在一行:
select sequence_number, min(number), max(number)
from t
group by sequence_number
having min(number) <> max(number);
或者,您可以将其概括为单个行上的数字列表:
select sequence_number, listagg(number, ',') within group (order by number) as numbers
from t
group by sequence_number
having min(number) <> max(number);