添加序列检查列
Posted
技术标签:
【中文标题】添加序列检查列【英文标题】:Add a sequence check column 【发布时间】:2015-05-20 07:59:58 【问题描述】:您能否帮我编写一个脚本来设置一个新列 = 该列是否比上面的列多一个。我希望它检查序列以检测丢失的文档编号。
我想我显然需要排除第一行?
在 IDEA 和 Excel 中显然非常简单,只是不确定是否使用 SQL?
非常感谢, J
【问题讨论】:
你使用的是什么版本的 SQL-server,表是什么样的,你上面说的顺序是什么? SQL Server 2008,该表由一列、一个数字列表、101、102、103 组成。我在它旁边有一列,我只想指示 True 或 False 真的,它在哪里遵循顺序? 这个问题看起来很相似:***.com/questions/1057389/… @klas 在 cmets,谢谢。 ***.com/questions/1057389/… @KlasLindbäck 您链接到 2009 年的 sqlserver 2005 问题。从那时起很多事情都发生了变化 【参考方案1】:Klas Lindbä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
【讨论】:
【参考方案2】:如果您只想检查列是否存在间隙,则:
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
这意味着这些值打破了顺序。
【讨论】:
以上是关于添加序列检查列的主要内容,如果未能解决你的问题,请参考以下文章