我有这张桌子
ID | Seq
------------
A 1
A 2
A 3
B 1
B 2
B 3
B 3 <--duplicate seq where ID=B
C 1
C 2
C 4 <--missing seq id number 3
D 1
D 2
. .
. .
有没有办法检测Seq列逻辑中是否/何时出现错误,特别是有跳转和/或重复时。
答案 0 :(得分:7)
试试这个:
这应该在sql server和Oracle
中都可以正常工作select ID,seq
from(
select ID,seq,
row_number() over (partition by id order by seq ) rn
from t_seq)a
where a.seq<>a.rn
答案 1 :(得分:2)
这些都是SQL不可知的,所以应该可以在任何rdbms中使用。
这将检查序列中的中断:
select t1.id, t1.seq
from t_seq t1
where
t1.seq <> 1
and not exists (
select *
from t_seq t2
where t2.id = t1.id
and t2.seq = t1. seq - 1
)
这将检查重复:
select t1.id, t1.seq
from mytable t1
group by t1.id, t1.se1
having count(*) > 1
答案 2 :(得分:0)
要获取重复项,您可以使用以下T-SQL。
SELECT ID, Seq FROM MyTable GROUP BY ID, Seq HAVING COUNT(Seq) > 1
修改强>
为了找出丢失的序列号,我已将njr101提供的代码更新为:
SELECT ID, Seq FROM MyTable t1 WHERE ID IN (
SELECT ID FROM MyTable
GROUP BY ID
HAVING COUNT(DISTINCT Seq) <> MAX(Seq)
) AND t1.seq <> 1 AND NOT EXISTS (
SELECT * FROM MyTable t2 WHERE t2.id=t1.id AND t2.seq = t1.seq - 1
)
ORDER BY ID
第一个子查询计算该ID的不同行数(忽略重复项)。如果该数字与结果集中包含的最大数量相同,则该ID应该适用于该ID。如果不相等,则结果将在子查询中可用。
第二部分(在njr101的查询的帮助下),将结果集过滤为仅包含应插入缺失值的最后一个ID和seq。结果如下:
My Data
=========
A 1
A 2
A 3
A 20 <--- Missing (displayed in results)
B 1
B 2
B 3
B 3
B 4
C 1
C 2
C 4 <--- Missing (displayed in results)
C 5
C 15 <--- Missing (displayed in results)
C 16
Results
=======
A 20
C 4
C 15