首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找序列中的缺失值

查找序列中的缺失值
EN

Stack Overflow用户
提问于 2012-02-17 20:24:39
回答 6查看 1.4K关注 0票数 0

Table1格式如下:

代码语言:javascript
运行
复制
Col1
1
2
3
4
6
7
8
9
10
13
14

如上所示,col1具有值序列,但是由于某种原因,用户没有插入5、11等等。如何找出序列中的缺失值。这里的序列是1到14,缺失值是5,11。请帮助我。

EN

回答 6

Stack Overflow用户

发布于 2012-02-17 20:36:25

正如在其他答案中所说的,最好的选择是与真实的序列表进行连接。您可以使用递归CTE创建一个:

代码语言:javascript
运行
复制
DECLARE @MaxNumber INT
SELECT @MaxNumber = MAX(Col1) FROM YourTable;

WITH CTE AS
(
    SELECT 1 Col1
    UNION ALL
    SELECT Col1+1
    FROM CTE 
    WHERE Col1+1 <= @MaxNumber
)
SELECT A.Col1
FROM CTE A
LEFT JOIN YourTable B
ON A.Col1 = B.Col1
WHERE B.Col1 IS NULL
OPTION(MAXRECURSION 0)
票数 4
EN

Stack Overflow用户

发布于 2012-02-17 20:32:24

这将适用于数字0- 2000对于较大的数字,您只需交叉连接原始结果集。

代码语言:javascript
运行
复制
with temp as (
  select distinct number
from master..spt_Values
where number between 0 and 2000
)

select * from
temp t
left join your_table y on y.col1 = t.number
where y.col1 is null 

或者使用交叉连接

这将对数十亿人起作用,显然要慢一些。

代码语言:javascript
运行
复制
    WITH
      L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
      L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
      L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
      L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
      L4   AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
      L5   AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
      Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)

  select * from
    l5 t
    left join your_table y on y.col1 = t.n
    where y.col1 is null 
票数 3
EN

Stack Overflow用户

发布于 2012-02-17 20:34:33

这看起来很像是

SQL query to find Missing sequence numbers

有一个建议,这将是可行的:

代码语言:javascript
运行
复制
SELECT      l.id + 1 as start
FROM        Table1 as l
LEFT JOIN   Table1 as r on l.id + 1 = r.id
WHERE       r.id IS NULL

否则,您可以在表上使用顺序表进行连接。从上面的问题中,您可以查看http://www.projectdmx.com/tsql/tblnumbers.aspx来了解如何生成合适的顺序表,连接将类似于

代码语言:javascript
运行
复制
SELECT      #sequence.value
FROM        #sequence
LEFT JOIN   Table1 ON #sequence.value = Table1.value
WHERE       Table1.value IS NULL
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9328145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档