SQL Server 2008 R 2――最小nIndexを検索します。nIndexは存在しますが、nIndex+1は最小連続配列の中の最大値を求めます。

3702 ワード

実はみんなは少し頭を動かします。問題は最小の連続配列の中の最大値を求めて、配列の大きさは1になります。
==========================================================================================================================
芝居のセットを作って、仏を西に送ります。
学習研究を容易にするためには、必ず例示的なコードをフルセットで書く必要があります。

-------------------------------------------------------------------------------------
 --by wls
 --   SQL          
 USE tempdb
 GO
 -------------------------------------------------------------------------------------
 IF OBJECT_ID (N't_MaxInMinContinuousArr', N'U') IS NOT NULL
 DROP TABLE t_MaxInMinContinuousArr;
 GO
 CREATE TABLE t_MaxInMinContinuousArr(SNId INTEGER PRIMARY KEY,SomeDate DATETIME)
 GO
 -------------------------------------------------------------------------------------
 DECLARE  @i INT
 SET @i =       --SNId   
 DECLARE @TestScale INTEGER
 SET @TestScale=+@i  --    
 DECLARE @t DATETIME ,
     @t DATETIME ,
     @dd INT ,
     @dayadd INT ,
     @tRes DATETIME
 SET @t = '-- ::'
 SET @t = '-- ::'
 SET @dd = DATEDIFF(dd, @t, @t)
 WHILE @i < @TestScale  --    
   BEGIN 
    SET @dayadd = @dd * RAND() 
    SET @tRes = DATEADD(dd, @dayadd, @t) + RAND()  
    INSERT  INTO t_MaxInMinContinuousArr VALUES(@i , @tRes)
    SET @i = @i + 
   END
 GO
 --SELECT TOP * FROM t_MaxInMinContinuousArr
 --GO
 -------------------------------------------------------------------------------------
 --Delete some SNId randomly
 DECLARE @TestScale INTEGER
 SET @TestScale=  --    
 DELETE FROM t_MaxInMinContinuousArr WHERE SNId=--(SELECT abs(checksum(newid()))%@TestScale + )
 DELETE FROM t_MaxInMinContinuousArr WHERE SNId=--(SELECT abs(checksum(newid()))%@TestScale + )
 GO
 --SELECT TOP * FROM t_MaxInMinContinuousArr
 --GO
 -------------------------------------------------------------------------------------
 --now find the SNId that SNId+ is missing.
 WITH TMinAndMaxSNId
 AS(
 SELECT MIN(SNId) AS MinSNId,MAX(SNId) AS MaxSNId FROM t_MaxInMinContinuousArr  --The min and max SNId
 ),
 TContinuousId
 AS
 (
 SELECT number AS SNIdCmped FROM master..spt_values,TMinAndMaxSNId WHERE type='p' AND number >=TMinAndMaxSNId.MinSNId AND number <=TMinAndMaxSNId.MaxSNId
 )
 SELECT MIN(res.SNIdCmped)- FROM
 (
 SELECT  SNIdCmped FROM TContinuousId
 EXCEPT 
 SELECT  SNId FROM t_MaxInMinContinuousArr) AS res 
 GO
  実行計画を添付します

 =======================================================================
このコードが使えるかどうかは分かりませんが、先に発表しました。
ネットワークコードはリスクがあります。コピー&ペーストは慎重にしてください。
この2つの文を実行してキャッシュをクリアします。

DBCC FREEPROCCACHE 
GO
DBCC DROPCLEANBUFFERS
GO
==========================================================================================================================
2051103-01
コードに問題があります。時間があります。
==========================================================================================================================
2051103-02
また試してみましたが、2048以内の欠落検索しか処理できませんでした。これは敏感な数字で、研究しなければなりません。
もちろんプロではないかもしれません。コードに問題があります。
幸いに開発、生産の中で出会った問題ではないです。ゆっくりと分析して問題を探すことができます。
このことのヒントは、「あなた達のこれらの嫌な爬虫類の小さいウェブサイト、間違ったコードはここにあります。私はまだ変えません。」
あなた達の行為は違法です。通知して削除すればいいというわけではありません。
すべての法律が私に与えた権利を保留します。