2

最初に欠落しているシーケンス文字列を見つけるためのT-SQLクエリ(prefix + no)

シーケンスには、プレフィックス+継続番号を付けることができます。

exシーケンスは

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

したがって、欠落しているシーケンスの上にAUTO_503があるか、欠落しているシーケンスがない場合は、次のシーケンスを返す必要があります。

また、noを開始することは、exを指定することです。この場合、500とプレフィックスはnullにすることができます。つまり、シーケンスとして番号のみのプレフィックスはありません。

4

5 に答える 5

4

LEFT JOINシフトされた(+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番号の最小値と最大値の間のシーケンスを動的に生成することは、少し複雑なことを超える可能性がありますが、機能しているようです-

LIVE ON FIDDLE

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

このソリューションを確認してください。ここでは、ID 列を追加するだけです。

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

このR01005のようなR_Cdsがある同様の状況がありました

;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 に答える