• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 雪落无声 | 发布时间: 2025-6-18 12:35| 查看数: 26| 评论数: 0|帖子模式

    其实大家稍微动下大脑,问题可以转化为,是求最小连续数组中的最大值,数组大小可以为1。
    =======================================================================
    做戏做全套,送佛送到西。
    为了便于学习研究,必然是要写全套示例代码的。
    1. -------------------------------------------------------------------------------------
    2. --by wls
    3. --非专业SQL 不求高效 但求能跑
    4. USE tempdb
    5. GO
    6. -------------------------------------------------------------------------------------
    7. IF OBJECT_ID (N't_MaxInMinContinuousArr', N'U') IS NOT NULL
    8. DROP TABLE t_MaxInMinContinuousArr;
    9. GO
    10. CREATE TABLE t_MaxInMinContinuousArr(SNId INTEGER PRIMARY KEY,SomeDate DATETIME)
    11. GO
    12. -------------------------------------------------------------------------------------
    13. DECLARE  @i INT
    14. SET @i =       --SNId起始值
    15. DECLARE @TestScale INTEGER
    16. SET @TestScale=+@i  --数据规模
    17. DECLARE @t DATETIME ,
    18.      @t DATETIME ,
    19.      @dd INT ,
    20.      @dayadd INT ,
    21.      @tRes DATETIME
    22. SET @t = '-- ::'
    23. SET @t = '-- ::'
    24. SET @dd = DATEDIFF(dd, @t, @t)
    25. WHILE @i < @TestScale  --数据规模
    26.    BEGIN
    27.     SET @dayadd = @dd * RAND()
    28.     SET @tRes = DATEADD(dd, @dayadd, @t) + RAND()  
    29.     INSERT  INTO t_MaxInMinContinuousArr VALUES(@i , @tRes)
    30.     SET @i = @i +
    31.    END
    32. GO
    33. --SELECT TOP * FROM t_MaxInMinContinuousArr
    34. --GO
    35. -------------------------------------------------------------------------------------
    36. --Delete some SNId randomly
    37. DECLARE @TestScale INTEGER
    38. SET @TestScale=  --数据规模
    39. DELETE FROM t_MaxInMinContinuousArr WHERE SNId=--(SELECT abs(checksum(newid()))%@TestScale + )
    40. DELETE FROM t_MaxInMinContinuousArr WHERE SNId=--(SELECT abs(checksum(newid()))%@TestScale + )
    41. GO
    42. --SELECT TOP * FROM t_MaxInMinContinuousArr
    43. --GO
    44. -------------------------------------------------------------------------------------
    45. --now find the SNId that SNId+ is missing.
    46. WITH TMinAndMaxSNId
    47. AS(
    48. SELECT MIN(SNId) AS MinSNId,MAX(SNId) AS MaxSNId FROM t_MaxInMinContinuousArr  --The min and max SNId
    49. ),
    50. TContinuousId
    51. AS
    52. (
    53. SELECT number AS SNIdCmped FROM master..spt_values,TMinAndMaxSNId WHERE type='p' AND number >=TMinAndMaxSNId.MinSNId AND number <=TMinAndMaxSNId.MaxSNId
    54. )
    55. SELECT MIN(res.SNIdCmped)- FROM
    56. (
    57. SELECT  SNIdCmped FROM TContinuousId
    58. EXCEPT
    59. SELECT  SNId FROM t_MaxInMinContinuousArr) AS res
    60. GO
    复制代码
    附上执行计划

    =======================================================================
    我也不知道这代码能不能用,先发表了后续慢慢改吧。
    网络代码有风险 复制粘贴需谨慎
    执行这两个语句清缓存。
    1. DBCC FREEPROCCACHE
    2. GO
    3. DBCC DROPCLEANBUFFERS
    4. GO
    复制代码
    =======================================================================
    20151103-01
    代码有问题 有空改
    =======================================================================
    20151103-02
    又尝试了一下(大概几十次猜范围),发现只能处理2048以内的缺失查找。这是个敏感的数字,得研究下。
    当然也可能是我不专业,写的代码有问题。
    幸好不是我在开发、生产中遇到的问题,还能悠哉悠哉的分析查找问题。
    这件事的启示是:你们这些讨人厌的爬虫小网站,错误代码就在这里我还就是不改了。
            你们的行为是违法的,并不是说通知然后删除就是可以的。
            我保留一切法律赋予我的权利。

    来源:https://www.jb51.net/article/74278.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表