SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小延續數組中的最大值。本站提示廣大學習愛好者:(SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小延續數組中的最大值)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小延續數組中的最大值正文
其實大家略微動下大腦,問題可以轉化為,是求最小延續數組中的最大值,數組大小可以為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
附上執行方案

=======================================================================
我也不知道這代碼能不能用,先發表了後續漸漸改吧。
網絡代碼有風險 復制粘貼需慎重
執行這兩個語句清緩存。
DBCC FREEPROCCACHE GO DBCC DROPCLEANBUFFERS GO
=======================================================================
20151103-01
代碼有問題 有空改
=======================================================================
20151103-02
又嘗試了一下(大約幾十次猜范圍),發現只能處置2048以內的缺失查找。這是個敏感的數字,得研討下。
當然也能夠是我不專業,寫的代碼有問題。
幸虧不是我在開發、消費中遇到的問題,還能悠哉悠哉的剖析查找問題。
這件事的啟示是:你們這些討人厭的爬蟲小網站,錯誤代碼就在這裡我還就是不改了。
你們的行為是守法的,並不是說告訴然後刪除就是可以的。
我保存一切法律賦予我的權益。