添加序列检查列

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

这意味着这些值打破了顺序。

【讨论】:

以上是关于添加序列检查列的主要内容,如果未能解决你的问题,请参考以下文章

检查表中是不是存在列,如果没有,则添加列

将列表添加到 Excel 列

添加计算列以检查值是不是在另一个表中

当 SimpleCursorAdapter 将值从表添加到 listView 时检查列值

如何在添加记录之前检查表中的现有列?

在火花作业scala中添加新列之前检查空条件[重复]