2

用于查找第一个缺失序列字符串的 T-SQL 查询(前缀+否)

序列可以有前缀 + 连续编号。

ex 序列将是

ID
-------
AUTO_500
AUTO_501
AUTO_502
AUTO_504
AUTO_505
AUTO_506
AUTO_507
AUTO_508

所以上面丢失的序列是AUTO_503,或者如果没有丢失的序列,那么它必须返回下一个序列。

同样开始 no 是指定 ex。500 在这种情况下,前缀可以为空,即没有前缀,只有数字作为序列。

4

5 回答 5

4

您可以LEFT JOIN使用 shift(+1) 值上的 id 号来按顺序查找间隙:

SELECT 
    MIN(a.offsetnum) AS first_missing_num
FROM 
(
    SELECT 500 AS offsetnum
    UNION
    SELECT CAST(REPLACE(id, 'AUTO_', '') AS INT) + 1
    FROM tbl
) a
LEFT JOIN
    (SELECT CAST(REPLACE(id, 'AUTO_', '') AS INT) AS idnum FROM tbl) b ON a.offsetnum = b.idnum
WHERE 
    a.offsetnum >= 500 AND b.idnum IS NULL

SQLFiddle 演示

于 2012-07-22T09:22:09.580 回答
3

使用递归 CTE 动态生成 ID 号的最小值和最大值之间的序列可能会有点复杂,但它似乎有效 -

活在小提琴上

CREATE TABLE tbl (
  id VARCHAR(55)
);

INSERT INTO tbl VALUES 
('AUTO_500'),
('AUTO_501'),
('AUTO_502'),
('AUTO_504'),
('AUTO_505'),
('AUTO_506'),
('AUTO_507'),
('AUTO_508'),
('509');

;WITH 

  data_cte(id)AS
    (SELECT [id] = CAST(REPLACE(id, 'AUTO_', '') AS INT) FROM tbl)

  ,maxmin_cte(minId, maxId)AS
    (SELECT [minId] = min(id),[maxId] = max(id) FROM data_cte) 

  ,recursive_cte(n) AS 
  (
     SELECT [minId] n from maxmin_cte
     UNION ALL
     SELECT (1 + n) n FROM recursive_cte WHERE n < (SELECT [maxId] from maxmin_cte)
  )

SELECT x.n 
FROM 
     recursive_cte x
     LEFT OUTER JOIN data_cte y ON
        x.n = y.id
WHERE y.id IS NULL
于 2012-07-22T11:02:28.130 回答
1

检查这个解决方案。在这里你只需要添加标识列。

CREATE TABLE tbl (
      id VARCHAR(55),
      idn int identity(0,1)
    );

    INSERT INTO tbl VALUES
    ('AUTO_500'),
    ('AUTO_501'),
    ('AUTO_502'),
    ('AUTO_504'),
    ('AUTO_505'),
    ('AUTO_506'),
    ('AUTO_507'),
    ('AUTO_508'),
    ('509');

    SELECT min(idn+500) FROM tbl  where 'AUTO_'+cast((idn+500) as varchar)<>id
于 2012-07-23T05:37:38.520 回答
1

试试这个:

with cte as(
select cast(REPLACE(id,'AUTO_','') as int)-500+1 [diff],ROW_NUMBER() 
over(order by cast(REPLACE(id,'AUTO_','') as int)) [rnk] from tbl)
select top 1 'AUTO_'+cast(500+rnk as varchar(50)) [ID] from cte 
where [diff]=[rnk] 
order by rnk desc

SQL Fiddle 演示

于 2012-07-24T13:04:12.777 回答
0

有类似的情况,我们有像这样的 R_Cds R01005

;with Active_R_CD (R_CD)
As
(
Select Distinct Cast(Replace(R_CD,'R', ' ') as Int) 
from table
where stat = 1)

select Arc.R_CD + 1 as 'Gaps in R Code'
from Active_R_CD as Arc
  left outer join Active_R_CD as r on ARC.R_CD + 1 = R.R_CD
where R.R_CD is null
order by 1
于 2016-05-24T20:24:17.293 回答