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示例如下:
```SQLSELECT 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示例如下:
```SQLcreate proc dbo.split_resursively
@num_val intas
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实现数字均分的几种技巧,各有所长,可根据实际情况来选择最适合项目需求的方法实现数字均分。