要计算和分组的范围

时间:2019-06-24 04:25:14

标签: php sql

我有一组值,例如:标题A 具有值 27.32 标题B 具有值27.33 标题C 具有值27 。在这里,我必须检查哪个标题,值是否匹配,并且可以在正负 3%的限制范围内将它们分组在一起。 因此,在上面的示例中, B值在A的+ -3%色限内,因此A和B可以组合在一起。 C不会归类为不在限制范围内。

现在,如果除了上述值之外,我还拥有另一个标题D(其值为27.01)和E(其值为26),那么C和D也应分组在一起。

Data:
---------------
Title   Values
---------------
A   27.32
B   27.33
C   27
D   27.01
E   26

预期结果

---------------
Title   Values
---------------
A,B Derived value in +-3% range of actual value(either title A or B)
C,D Derived value in +-3% range of actual value(either title C or D)
E   26

上面的输出将指定标题A和标题B我可以使用派生值 C和D也是如此。对于标题E,未找到匹配项,因此将使用实际值

无法为此导出逻辑。尽管创建的公差范围为+ -3%,但稍后要检查创建的公差范围中的实际值。

2 个答案:

答案 0 :(得分:0)

假设a和b的正确值分别是问题正文中的23.32和23.33,而不是示例表中的27.32和27.33(因为您期望的结果没有其他意义),也许像这样自我加入?

SELECT CASE WHEN title_b IS NOT NULL THEN title_a || ',' || title_b
       ELSE title_a
       END AS Title
     , CASE WHEN title_b IS NOT NULL THEN 'Derived value in +-3% range of actual value(either title ' || title_a || ' or ' || title_b || ')'
       ELSE (SELECT value FROM data AS d WHERE d.title = title_a)
       END AS Value
FROM (SELECT DISTINCT
         coalesce(min(l.title, r.title), l.title) AS title_a
       , max(l.title, r.title) AS title_b
      FROM data AS l
      LEFT OUTER JOIN data AS r ON l.title <> r.title
                               AND r.value BETWEEN l.value - (l.value * .03)
                                               AND l.value + (l.value * .03))
ORDER BY title_a;

使用sqlite进行测试(您没有提到正在使用的 数据库,这总是很有用),它会产生:

Title       Value                                                           
----------  ----------------------------------------------------------------
A,B         Derived value in +-3% range of actual value(either title A or B)
C,D         Derived value in +-3% range of actual value(either title C or D)
E           26                                                              

答案 1 :(得分:0)

我创建了一个缩放器函数,并在SQL查询中使用了它。

--SQL query:

Declare @a float=38.56,@b float,@c float,@freq float,@value float,@i int=0

while @i < (select count(distinct titles) from tableA) -- titles, a column name in tableA
begin
        select @freq=freq from tableA where id = @i+1
        begin
                set @b= @freq-(@freq*0.03)
                set @c=@freq+(@freq*0.03)
                if @a between @b and @c
                    begin
                        set @value = @freq
                        break
                    end
                else
                    begin
                        set @value =@a
                    end
        end 
    set @i=@i+1 
end
print convert(varchar,@value)

我可以使用同一组查询来创建可以接受一个参数作为输入的函数。现在,将对我的查询使用函数,例如 select *,function(@inputparameter)作为表A的派生输出