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以内的缺失查找。这是个敏感的数字,得研究下。

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

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

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

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

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

(0)

相关推荐

  • ASP.NET下向SQLServer2008导入文件实例操作方法

    ASP.NET向SQL Server导入文件主要用到FileUpload控件的FileBytes属性.该属性从FileUpload控件所指定的文件返回一个字节数组 . 1.数据库准备 为了方便大家能够理解,这里我们只设计两个字段,一个是文件类型字段,字段名为FileType,另一个是存放文件内容字段,字段名为FileContent.创建数据库 ,数据库名为VarFile,语句如下: CREATE DATABASE VARFILE GO 创建表,表名为FileInOut,语句如下: USE VAR

  • Win2008中SqlServer2008 无法打开错误日志文件导致无法启动的解决方法

    今天早上一个客户的SqlServer 2008的服务器应为重新修改配置导致网站打不开,链接到远程服务器之后,在服务器的事件查看器,发现如下错误, 错误描述: 日志名称: Application 来源: MSSQLSERVER 日期: 2011/10/25 11:30:49 事件 ID: 17058 任务类别: 服务器 级别: 错误 关键字: 经典 用户: 暂缺 计算机: WIN-VPS-SERVER 描述: initerrlog: 无法打开错误日志文件 'D:\WWW\Services\SQLD

  • sqlserver2008锁表语句详解(锁定数据库一个表)

    锁定数据库的一个表 复制代码 代码如下: SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 复制代码 代码如下: SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 复制代码 代码如下: SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SELECT 语句中"加锁选项"的功能说明 SQL Server提供了强大而完备的锁机

  • 还原sqlserver2008 媒体的簇的结构不正确的解决方法

    今天在本地数据库上还原一个数据库(WINDOWS方式进入,当时不知道关闭了SQLSERVER身份验证),无论怎么还原,都会出现错误:媒体的簇的结构不正确 方法,在百度上搜索不到解决方法. 最后我启用了windows和server综合验证,并且启用了SA,重新启动SQLSERVER2008,用SQLSERVER身份验证登录,然后还原数据库,结果是成功还原.

  • Win2003+apache+PHP+SqlServer2008 配置生产环境

    安装前的准备: 1.Apache2.2.2 2.PHP5.2.17 3.SqlServer2008 4.sqlncli.msi(SqlServer客户端,可以到微软官方网站去下载) 5.ntwdblib.dll (2000.80.194.0) 6.SQLSRV20.exe,即MicrosoftDriver 2.0 for PHP for SQL Server(sql server 2005 及2008使用SQLSRV20.exe, SQL Server 2010使用SQLSRV30.exe)(需

  • SQLServer2005与SQLServer2008数据库同步图文教程

    1,复制简介 简单的说,复制是获取一个或多个数据库的过程,它系统的针对出入不同数据库的数据,提供基于规则的拷贝机制. 复制分为三种角色, 1,发布服务器 发布服务器可以被看成是源数据库. 2 ,分发服务器 分发数据库针对更改而承担类似某些票据交换所的工作,他是一个特殊的分发数据库,用于对更改进行跟踪,同时也跟踪哪些订阅服务器已经收到了这些更改.除此之外,它还跟踪任何同步过程的结果,并知道发生了哪些必须解决的冲突. 3,订阅服务器 任何参与到于复制发布过程的数据库,订阅服务器并不只能接受数据,它还

  • sqlserver2008查看表记录或者修改存储过程出现目录名无效错误解决方法

    点工具栏中[显示估计的查询计划],结果提示Documents and Settings\XXX\Local Settings\Temp\1\xxx.tmp文件不能访问.查看发现没有1这个子目录--这是给1号远程连接会话用的临时目录,手工创建子目录1,即可正常查询

  • sqlserver2008安装报语言不符的解决方法

    安装SqlServer2008R2遇到系统提示: 复制代码 代码如下: SQL Server setup media does not support the language of the OS or does not have ENU localized files.Use the matching language-specific SQL Server media or change the OS locale through Control Panle. 英文翻译过来,大概意思是本安装

  • SQLserver2008使用表达式递归查询

    复制代码 代码如下: --由父项递归下级 with cte(id,parentid,text) as (--父项 select id,parentid,text from treeview where parentid = 450 union all --递归结果集中的下级 select t.id,t.parentid,t.text from treeview as t inner join cte as c on t.parentid = c.id ) select id,parentid,t

  • sqlserver2008 拆分字符串

    --说明:例如,将下列数据 id id_value ----------------- 1 'aa,bb' 2 'aa,bb,cc' 3 'aaa,bbb,ccc' --转换成以下的格式 id id_value ----------------- 1 'aa' 1 'bb' 2 'aa' 2 'bb' 2 'cc' 3 'aaa' 3 'bbb' 3 'ccc' --代码-------------------------------------------GO 复制代码 代码如下: create

  • 深入SqlServer2008 数据库同步的两种方式(Sql JOB)的分析介绍

    下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中.特点是它可以灵活的通过SQL的方式进行数据库之间的同步操作.可以在制定的时间时间作为任务计划自动执行.缺点是需要写SQL来进行操作.既然是数据库之间的同步就涉及到数据库之间的连接.建立连接是同步的第一步.SQL Server建立连接可以通过系统存储过程建立[是否还有其他方式,我还不清楚].存储过程有以下几个:sp_droplinkedsrvl

随机推荐