要求:有一个最小值 平均值 最大值 以及数的个数 ,编写一个SQL(函数) 模拟出中间所有的数据,但是最小值和最大值必须出现,以及模拟出的数据的平均值必须满足前面的平均值的要求。
比如: 最小值:300 平均值:350 最大值:400 数值个数为:6个
结果(只需要满足条件的一种就OK):300(1个) 320(2个) 380(2个) 400(1个)
要求:有一个最小值 平均值 最大值 以及数的个数 ,编写一个SQL(函数) 模拟出中间所有的数据,但是最小值和最大值必须出现,以及模拟出的数据的平均值必须满足前面的平均值的要求。
比如: 最小值:300 平均值:350 最大值:400 数值个数为:6个
结果(只需要满足条件的一种就OK):300(1个) 320(2个) 380(2个) 400(1个)
create view view_rand
as
SELECT rand() as rd
go
create function f_Rand()
returns float
as
begin
return (select rd from view_rand)
end
GO
Create FUNCTION RandomNumbers(@Max INT,@Min INT, @Avg INT, @Cnt INT)
RETURNS @tab table(a INT)
AS BEGIN
DECLARE @tmpTable table (id int ,a int)
DECLARE @remain INT = @avg*@cnt -@Max -@Min*(@Cnt-1)
IF(@remain <= 0 OR @Cnt <=0)
return
DECLARE @i INT = @Cnt -2
WHILE @i > 0
BEGIN
INSERT INTO @tmpTable VALUES (@i,@Min)
SET @i = @i - 1
END;
DECLARE @id int
WHILE @remain>0 BEGIN
SET @id =CEILING(dbo.f_Rand()*(@Cnt-2))
IF @id =0
SET @i =1
UPDATE @tmpTable SET a=a+1 WHERE id= @id
SET @remain=@remain -1
end
INSERT INTO @tab values (@Max),(@Min)
INSERT INTO @tab SELECT a FROM @tmpTable
return
END
GO
--测试
SELECT * FROM dbo.RandomNumbers(400,100,240,5)