⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 宝塔形数据的处理.sql

📁 sqlserver 数据库编程的绝好脚本
💻 SQL
字号:
/*--

第一层   -                    1 
第二层   -           2                3
第三层   -      4        5        6        7
第四层   -    8   9   10   11   12   13   14  15 

将顺序的数据(1~N)依如下规则排列
1,排成塔形.
2,下一层所排数字是对上一层的两倍.(第一层为1个,第二层为2个,第三层4个,如此类推)
3,自上到下,自左到右紧密排列.

现在要找出每个号码下面号码的个数.

--邹建 2004.4--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_id]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id_num]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_id_num]
GO

--得到每个号码下面包含的号码
create function f_id(
@num int,		--那个数下面的子
@max_level int	--统计到第几层
)returns @re table(id int identity(1,1),num int,level int)
as 
begin
	declare @level int,@left int,@i int,@j int
	select @level=0,@i=@num
	while @i>1
		select @level=@level+1,@i=@i/2
	if @level<@max_level
	begin
		insert @re values(@num,@level+1)
		select @left=(@num%power(2,@level))*2
			,@level=@level+1
			,@num=power(2,@level)
			,@i=0,@j=2
		while @level<@max_level
		begin
			while @i<@j
			begin
				insert @re values(@left+@num+@i,@level+1)
				set @i=@i+1
			end
			select @level=@level+1
				,@left=@left*2
				,@num=@num*2
				,@i=0,@j=@j*2
		end
	end
	return
end
go

--得到每个号码下面包含的号码个数(作者: DigJim(挖土) )
create function f_id_num(
@inputnum int,		--数字
@totallevel int		--层数
)returns int 
as
begin 
	declare @i int,@count int,@result float

	--判断这个数所在的层
	select @i=1
		,@result=@inputnum/2
	
	while @result-1>0
		select @result=@result/2,@i=@i+1
	set @i=@totallevel-@i-1

	--计算这个数包含的个数
	set @count =2
	while @i>0
		select @count=@count*2,@i=@i-1
	return @count-2
end
go

--调用实现查询
select * from f_id(3,4)

select dbo.f_id_num(3,4)
go

/*--测试结果
id          num         level       
----------- ----------- ----------- 
1           3           2
2           6           3
3           7           3
4           12          4
5           13          4
6           14          4
7           15          4

(所影响的行数为 7 行)
--*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -