• SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小连续数组中的最大值


    =================================版权声明=================================

    版权声明:原创文章 谢绝转载 

    请通过右侧公告中的“联系邮箱(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以内的缺失查找。这是个敏感的数字,得研究下。

    当然也可能是我不专业,写的代码有问题。

    幸好不是我在开发、生产中遇到的问题,还能悠哉悠哉的分析查找问题。

    这件事的启示是:你们这些讨人厌的爬虫小网站,错误代码就在这里我还就是不改了。

            你们的行为是违法的,并不是说通知然后删除就是可以的。

            我保留一切法律赋予我的权利。

  • 相关阅读:
    subString源码分析
    我的three.js学习记录(三)
    我的three.js学习记录(二)
    2017-10-15
    我的three.js学习记录(一)
    我的Spring学习记录(三)
    我的Spring学习记录(二)
    我的Hibernate学习记录(二)
    我的Hibernate学习记录(一)
    Tomcat学习笔记
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/4930415.html
Copyright © 2020-2023  润新知