3

我有这张桌子

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 列的逻辑是否/何时出现错误,特别是是否存在跳转和/或重复。

4

3 回答 3

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


SQL 服务器的 SQL 小提琴演示


Oracle 的 SQL Fiddle 演示

于 2012-11-06T12:21:05.483 回答
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
于 2012-11-06T12:20:08.460 回答
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 的值应该没问题。如果不相等,则结果将在子查询中可用。

第二部分(借助 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
于 2012-11-06T12:24:21.860 回答