我有一组值,例如:标题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%,但稍后要检查创建的公差范围中的实际值。
答案 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的派生输出。