MSSQL实现数字均分的技巧(mssql数字均分)

MS-SQL实现数字均分的技巧

数字均分是将一组数字分配到多行或多列中,并保证各列或各行中的和完全相等的一种技能。MS-SQL提供了多种技巧来实现数字均分,其中常用的有根据多随机数表生成值、使用滑动窗口函数及递归查询等方法。

首先,介绍使用多随机数来实现技巧。首先,编写一个存储过程,用于生成一系列不重复的随机数。编写一个临时表,定义一个字段存储数字均分的和,第二至N列存储生成的随机数,其列的数量的随机数的数量。存储过程的SQL示例如下:

“`SQL

create proc dbo.gen_rand_table

@rand_count int

as

begin

create TABLE #tmp_tbl

(

num_sum int,

n1 float,

n2 float,

n3 float,

n4 float,

n5 float,

n6 float,

n7 float,

n8 float,

n9 float,

n10 float

)

declare @num_val int

set @num_val = 1

while(@num_val

begin

insert into #tmp_tbl

values( @num_val,

RAND(), RAND(), RAND(), RAND(), RAND(), RAND(), RAND(), RAND(), RAND(), RAND());

set @num_val = @num_val + 1

end

end


接着,调用存储过程生成相应数量&随机数表,使用SUM()函数计算各列和,通过SQL查询即可实现数字均分。SQL示例如下:

```SQL
SELECT SUM(num_sum) AS total,
SUM(n1) AS n1,
SUM(n2) AS n2,
SUM(n3) AS n3,
SUM(n4) AS n4,
SUM(n5) AS n5,
SUM(n6) AS n6,
SUM(n7) AS n7,
SUM(n8) AS n8,
SUM(n9) AS n9,
SUM(n10) AS n10
FROM #tmp_tbl

另外,还可以使用滑动窗口函数来实现数字均分,该方法是在每行上使用OVER()函数,重点在于如何分组:通过某列取模(MOD)并不断改变offset来实现。下面以表tbl_val中针对某一列NUM值从小到大排序,使用滑动窗口函数来按照偶数行行数均分成两组为例,SQL示例如下:

“`SQL

SELECT a.ID,

a.NUM,

SUM(b.NUM) OVER(PARTITION BY a.seq MOD 2 ORDER BY a.id) sum_val

FROM

(

SELECT ROW_NUMBER() OVER(ORDER BY ID) AS seq,

ID,

NUM

FROM tbl_val

) a

LEFT JOIN tbl_val b

ON a.seq >= b.ID


最后,还可以使用递归来实现数字均分。通过将总体分为增加值组和减少值组,从而找出最小差值,此时满足数字均分的要求。比如,针对一行数据(x,y,z)的数值为(3,3,3),和为9,分为两组“(3,3),(3)”,调用一个递归存储过程实现数字均分,SQL示例如下:

```SQL
create proc dbo.split_resursively
@num_val int
as
begin
declare @rpt int;
set @rpt = 0;
declare @cur int;
set @cur = 3;
WHILE(@rpt
BEGIN
IF(@num_val - @cur > 0)
BEGIN
SET @num_val =@num_val - @cur;
SET @cur = @cur + 1;
PRINT @cur;
IF(@num_val > 0)
BEGIN
IF(@num_val - @cur > 0)
PRINT @num_val;
END
END
SET @rpt =@rpt + 1;
END
end

以上就是MS-SQL实现数字均分的几种技巧,各有所长,可根据实际情况来选择最适合项目需求的方法实现数字均分。


数据运维技术 » MSSQL实现数字均分的技巧(mssql数字均分)