首页 > 解决方案 > SQL Server - 生成 MAX - MIN = 参数的 6 个浮点值

问题描述

我需要以最佳方式和性能生成 6 个浮点值,其中 1 个小数:

MAX(value) - MIN(value) = @parameter

我有这个代码:

BEGIN

DECLARE @parameter float = 0.6      

    WHILE @validated = 0
        BEGIN

            IF @count < 6
            BEGIN -- fill table with 6 random values from 0 to 2 (with 1 decimal)
                INSERT INTO @tempdata ([value])
                SELECT ROUND(RAND()*(2-0),1);
                SET @count = @count + 1
            END



            IF @count = 6 -- if temp table has 6 values then do the validation
            BEGIN
                SELECT @result = (MAX(value) - MIN(value)) FROM @tempdata
                IF(@result = @parameter)
                BEGIN
                    PRINT 'MATCH PARAMETER'

                    SET @validated = 1
                END
                ELSE
                BEGIN
                    DELETE @tempdata
                    SET @counter = 0
                END
            END

        END
   END

这是可行的,但有时需要 10 或 20 秒,而且应该更快。

例如,如果@parameter值为:0.8,那么我们需要6 个介于02之间的数字,其中 MAX - MIN 匹配,例如:

    0.7    
    1.1
    0.6
    0.9
    1.5
    1.2

MAX(1.5) - MIN(0.7) = 0.8

有什么线索吗?

标签: sqlsql-server

解决方案


with randvals(rval) as
( 
select rand()
union all
select rand()
union all
select rand()
union all
select rand()
union all
select rand()
union all
select rand()
),
arandvals(rval, xrval, mrval) as
(
select rval, max(rval) over() as xrval, min(rval) over() as mrval
from randvals
)
select cast(0.8 * rval / (xrval - mrval) as numeric(3,2))
from arandvals

推荐阅读