=================================版权声明=================================
版权声明:原创文章 谢绝转载
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
勿用于学术性引用。
勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善。
本文链接:http://www.cnblogs.com/wlsandwho/p/4930415.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
代码有问题 请勿使用 本文保持发布可访问状态仅为博主自己管理方便
=======================================================================
作为一只C++,每天回答SQL Server的问题感觉压力还是蛮大的。
略微(大概一分钟)仔细分析一下,就会发现,问题可以转化为:
求最小连续数组中的最大值,数组大小可以为1。
=======================================================================
做戏做全套,送佛送到西。
为了便于学习研究,必然是要写全套示例代码的。
1 ------------------------------------------------------------------------------------- 2 --by wls 3 --非专业SQL 不求高效 但求能跑 4 USE tempdb 5 GO 6 7 ------------------------------------------------------------------------------------- 8 IF OBJECT_ID (N't_MaxInMinContinuousArr', N'U') IS NOT NULL 9 DROP TABLE t_MaxInMinContinuousArr; 10 GO 11 12 CREATE TABLE t_MaxInMinContinuousArr(SNId INTEGER PRIMARY KEY,SomeDate DATETIME) 13 GO 14 15 ------------------------------------------------------------------------------------- 16 DECLARE @i INT 17 SET @i = 666 --SNId起始值 18 19 DECLARE @TestScale INTEGER 20 SET @TestScale=500000+@i --数据规模 21 22 DECLARE @t1 DATETIME , 23 @t2 DATETIME , 24 @dd0 INT , 25 @dayadd INT , 26 @tRes DATETIME 27 28 SET @t1 = '2010-01-01 00:00:00' 29 SET @t2 = '2025-12-31 00:00:00' 30 SET @dd0 = DATEDIFF(dd, @t1, @t2) 31 32 WHILE @i < @TestScale --数据规模 33 BEGIN 34 SET @dayadd = @dd0 * RAND() 35 SET @tRes = DATEADD(dd, @dayadd, @t1) + RAND() 36 37 INSERT INTO t_MaxInMinContinuousArr VALUES(@i , @tRes) 38 39 SET @i = @i + 1 40 END 41 GO 42 43 --SELECT TOP 100 * FROM t_MaxInMinContinuousArr 44 --GO 45 46 ------------------------------------------------------------------------------------- 47 --Delete some SNId randomly 48 DECLARE @TestScale INTEGER 49 SET @TestScale=500000 --数据规模 50 DELETE FROM t_MaxInMinContinuousArr WHERE SNId=678--(SELECT abs(checksum(newid()))%@TestScale + 1) 51 DELETE FROM t_MaxInMinContinuousArr WHERE SNId=667--(SELECT abs(checksum(newid()))%@TestScale + 1) 52 53 GO 54 55 --SELECT TOP 100 * FROM t_MaxInMinContinuousArr 56 --GO 57 58 ------------------------------------------------------------------------------------- 59 --now find the SNId that SNId+1 is missing. 60 WITH TMinAndMaxSNId 61 AS( 62 SELECT MIN(SNId) AS MinSNId,MAX(SNId) AS MaxSNId FROM t_MaxInMinContinuousArr --The min and max SNId 63 ), 64 TContinuousId 65 AS 66 ( 67 SELECT number AS SNIdCmped FROM master..spt_values,TMinAndMaxSNId WHERE type='p' AND number >=TMinAndMaxSNId.MinSNId AND number <=TMinAndMaxSNId.MaxSNId 68 ) 69 SELECT MIN(res.SNIdCmped)-1 FROM 70 ( 71 SELECT SNIdCmped FROM TContinuousId 72 EXCEPT 73 SELECT SNId FROM t_MaxInMinContinuousArr) AS res 74 GO
附上执行计划
=======================================================================
我也不知道这代码能不能用,先发表了后续慢慢改吧。
网络代码有风险 复制粘贴需谨慎
执行这两个语句清缓存。
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
=======================================================================
20151103-01
代码有问题 有空改
=======================================================================
20151103-02
又尝试了一下(大概几十次猜范围),发现只能处理2048以内的缺失查找。这是个敏感的数字,得研究下。
当然也可能是我不专业,写的代码有问题。
幸好不是我在开发、生产中遇到的问题,还能悠哉悠哉的分析查找问题。
这件事的启示是:你们这些讨人厌的爬虫小网站,错误代码就在这里我还就是不改了。
你们的行为是违法的,并不是说通知然后删除就是可以的。
我保留一切法律赋予我的权利。