那么从之前随机生产的数据得到较多量[骨牌存储箱]的数据。
我们将利用这部分数据进行演示关于地递归的利用技巧。
以下注释较多。如果不喜欢的话可以不看,并不影响对递归方法的理解。
- 递归代码:
1 /* 2 1、首先: 3 假设情形:现在要利用现有的骨牌进行多米诺骨牌游戏。 4 2、拍列: 5 我们现在要知道第一骨牌推到的具体是那些(可多骨牌推到-多数据流同时进行就是码SQL的一大优势,所以小弟劝戒大家能不用游标就不用游标),之后往后面继续排序。排序可行的规则可以参照现实。 6 3、推牌: 7 我们根据已经排列好的牌,开始推到。在牌进行的过程我们可以在这个过程添加过程标识。 8 */ 9 10 WITH 排列 AS ( 11 SELECT DENSE_RANK()OVER(ORDER BY 骨牌类型) AS LogoID -- 给骨牌分组,就是要同时进行推到的骨牌组 12 ,ROW_NUMBER()OVER(PARTITION BY 骨牌类型 ORDER BY 骨牌重量) AS OrderID -- 给骨牌排序,这边就是以骨牌重量从轻的骨牌到重的骨牌排序 13 ,[骨牌存储箱].* 14 FROM [骨牌存储箱] WITH(NOLOCK) 15 WHERE 1+1=2 16 ) 17 -- DROP TABLE #排列 18 SELECT * INTO #排列 19 FROM 排列 WITH(NOLOCK) 20 CREATE CLUSTERED INDEX PK_LogoID ON #排列(LogoID); 21 22 WITH 23 递归 AS( 24 SELECT * 25 ,1 AS NCount -- 我们可以在递归过程给递归的牌子做标记(任意发挥) 26 FROM #排列 初始 27 WHERE 初始.OrderID = 1 -- 第一块推到的 28 29 UNION ALL 30 31 SELECT 递归源.* 32 -- 以下:这个这个递归方法最重要的点,就是递归过程要执行的操作。 33 -- 举个现实的例子:当客户存在消费冲突的时候,也许在1天的时间内为客户冲动期,过了1天后至3天内的都为客服成效调解期。那么我们要确定客服成效期是在那个时间段,我们需要从时间上推导,在之前1天无冲动期,或者突然出现新状况投诉。 34 ,CASE 35 WHEN 递归.NCount <= 3 36 THEN NCount + 1 37 ELSE 1 38 END 39 FROM #排列 递归源 40 JOIN 递归 ON 递归源.LogoID= 递归.LogoID 41 WHERE 递归源.OrderID = 递归.OrderID + 1 42 ) 43 SELECT 递归.* 44 FROM 递归 45 ORDER BY LogoID,骨牌重量 46 OPTION(MAXRECURSION 0)-- 0表无限递归次数
- 执行结果:
以上仅代表个人见解,不喜着可以呲之以鼻,但是请勿喷!
时间: 2024-10-01 12:16:21