请你帮我一个脚本来设置一个新列=该列是否比上面的列多一个。我希望它检查序列以检测丢失的文档编号。
我想我显然需要排除第一行?
在IDEA和Excel中显然很简单,只是不确定SQL?
非常感谢, Ĵ
答案 0 :(得分:1)
KlasLindbäck评论中的链接引用了sqlserver 2005.在sqlserver 2012中,您可以使用LAG
;WITH CTE AS
(
SELECT
CASE WHEN
coalesce(LAG(a) over (order by a), 0) + 1 = a
THEN 1 ELSE 0 END SequenceIntact,
a
FROM (values(1),(3),(5),(6),(7)) t(a)
)
SELECT
SequenceIntact,
a
FROM cte
编辑:由于您使用的是sqlserver 2008,因此无法使用LAG,但您可以使用row_number - 我使用dense_rank来补偿重复项:
;WITH CTE as
(
SELECT
a - dense_rank() over (order by a) grp,
a
FROM (values(1),(3),(5),(6),(7)) t(a)
)
SELECT
CASE WHEN min(a) over (partition by grp) = a
and a > 1 -- allowing first value to have SequenceIntact
THEN 0 ELSE 1 END SequenceIntact,
a
FROM CTE
结果:
SequenceIntact a
1 1
0 3
0 5
1 6
1 7
答案 1 :(得分:0)
如果您只想检查列的间隙,那么:
DECLARE @t TABLE ( id INT)
INSERT INTO @t VALUES(1),(2),(4),(5),(8),(13),(14)
SELECT * FROM @t t1
LEFT JOIN @t t2 ON t2.id + 1 = t1.id
WHERE t2.id IS NULL
输出:
id id
1 NULL
4 NULL
8 NULL
13 NULL
这意味着这些值会破坏序列。