我有這樣的表如何用sql檢測錯誤的序列列?
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列的邏輯錯誤,特別是如果有跳躍和/或重複。
我有這樣的表如何用sql檢測錯誤的序列列?
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列的邏輯錯誤,特別是如果有跳躍和/或重複。
試試這個:
這應該工作無論是在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不可知的,所以應該適用於任何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
爲了讓你可以使用下面的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
其中RDBMS? SQL服務器..或MySQL?還是Oracle? –
這是針對SQL服務器的,但我深深感謝簡單的代碼,甚至可能與Oracle兼容 – jenswirf