SQL Server 2008 R2——以特定符号出现的次数回判断当前内容所在的层次
=================================版权声明=================================
版权声明:原创文章 禁止转载
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
勿用于学术性引用。
勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善。
本文链接:http://www.cnblogs.com/wlsandwho/p/4944971.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
某天下午,本来想在QQ群里回答个问题,结果发现DBA们早早的就给出答案开始潇洒的聊天了。
自己却在隔了好久才能给出答案。感觉自己跟大神相差了6小时以及一个互联网。
欣慰的是,我的SQL可读性高一点点。(大家好我是旁白,刚才作者被阿Q和孔乙己灵魂附体……)鄙视垃圾爬虫网站,祝你们生孩子没屁眼。
=======================================================================
贴一下原始问题。鄙视垃圾爬虫网站,祝你们生孩子没屁眼。
这个问题没有给主键或者ID之类的东西。层次标识符"["又是一个特殊符号,是不能够跟数据排序的。鄙视垃圾爬虫网站,祝你们生孩子没屁眼。
=======================================================================
下面上代码。鄙视垃圾爬虫网站,祝你们生孩子没屁眼。
1 ----------------------------------------------------------------------------------------- 2 --禁止转载 3 --by 王林森 2015.11.07 4 --http://www.cnblogs.com/wlsandwho/p/4944971.html 5 ----------------------------------------------------------------------------------------- 6 7 USE tempdb 8 GO 9 10 IF OBJECT_ID (N't_TestbyWLS', N'U') IS NOT NULL 11 DROP TABLE t_TestbyWLS; 12 GO 13 14 CREATE TABLE t_TestbyWLS(SomeData NVARCHAR(10)) 15 GO 16 17 INSERT INTO t_TestbyWLS VALUES ('a') 18 INSERT INTO t_TestbyWLS VALUES ('b') 19 INSERT INTO t_TestbyWLS VALUES ('c') 20 INSERT INTO t_TestbyWLS VALUES ('[') 21 INSERT INTO t_TestbyWLS VALUES ('e') 22 INSERT INTO t_TestbyWLS VALUES ('f') 23 INSERT INTO t_TestbyWLS VALUES ('[') 24 INSERT INTO t_TestbyWLS VALUES ('g') 25 INSERT INTO t_TestbyWLS VALUES ('h') 26 INSERT INTO t_TestbyWLS VALUES ('i') 27 GO 28 29 WITH TempSDId 30 AS 31 ( SELECT SomeData,ROW_NUMBER() OVER( ORDER BY (SELECT NULL) ) AS SDId FROM dbo.t_Testbywls ), 32 TempIdPos 33 as 34 (SELECT sdid FROM TempSDId WHERE somedata='[') 35 SELECT SomeData ,1+(SELECT COUNT(*) FROM tempsdid WHERE sdid<=t.sdid AND somedata='[' ) AS TheLevel FROM tempsdid t
在CTE里设置了id,并获得了标识符的id。
select的子查询中,统计了不超过当前行id时,标识符出现的次数。
加1是因为从1开始计数。
下面是计划任务
=======================================================================
非专业SQL,不求高效,但求能跑。鄙视垃圾爬虫网站,祝你们生孩子没屁眼。
=======================================================================
20151109-01 考虑到版权之类的事情,网友提供的方法不便于贴到博文中,需要自行翻阅评论内容。
- 2楼Page-7y
- 不错,受教了。
- Re: 王林森
- @Page-7y,引用不错,受教了。,共同学习罢了。
- 1楼ahdung
- 另一个思路,递归CTE法:,--加行号WITH cteAddRowNo AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS #39;ID#39;,Col1 FROM #t), cte AS (SELECT TOP 1 ID, Col1,1 AS #39;Num#39; FROM cteAddRowNo --将首行作为基准UNION ALL --递归添加每一行,Num遇quot;[quot;加1,否则与上行相同SELECT a.ID, a.col1, Num + CASE a.Col1 WHEN #39;[#39; THEN 1 ELSE 0 ENDFROM cteAddRowNo a JOIN cte b ON a.ID=b.ID+1WHERE a.ID=b.ID+1)SELECT Col1,Num FROM cte
- Re: 王林森
- @ahdung,谢大神赐教,===============================================,我把@ahdung给的答案略作修改,以便于能够用使用博文中的测试代码。,删除了多余的语句。,===============================================,执行计划,,===============================================,ahdung的代码(已修改),WITH TempSDId AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS #39;ID#39; ,somedata FROM t_Testbywls)--加行号, TempReCursionAS (SELECT TOP 1 ID, somedata,1 AS #39;TheLevel#39; FROM TempSDId --将首行作为基准UNION ALL --递归添加每一行,Num遇quot;[quot;加1,否则与上行相同SELECT a.ID, a.somedata, TheLevel + CASE a.somedata WHEN #39;[#39; THEN 1 ELSE 0 ENDFROM TempSDId a JOIN TempReCursion b ON a.ID=b.ID+1)SELECT somedata,TheLevel FROM TempReCursion