我有这段代码,我正在尝试将[Dis]
与[Estimator]
进行比较,这是我要添加的变量:
SELECT
[Id],
[Sym],
[Month],
[Dis],
Estimator = 4/count(Id) over (partition by Sym, Month)
FROM
[RegularPayResultsYearly]
同样,我正在尝试将Dis
与Estimator
进行比较。
例如,count(Id) over (partition by Sym, [Month])
是12091次观察。
问题:Dis
列是float
类型(示例值:
8.2944916060179E-06,9.07691249104339E-05)似乎
4/count(Id) over (partition by Sym, [Month]) as cnt
这是3.308245802663138e-4不能超过零它显示我 估算器= 0.
有什么方法可以改变吗?
感谢。
答案 0 :(得分:0)
不幸的是,您无法使用相等性来比较浮点时间 - 并且始终如一。你可以有两个解决方案。一种是取差值的绝对值,如果小于某个(任意)阈值则称之为0:
SELECT . . .,
(CASE WHEN ABS(Dis) - 4/count(Id) over (partition by Sym, Month)) < 0.001
THEN 'EQUAL'
ELSE 'NOTEQUAL'
END)
FROM RegularPayResultsYearly
第二种是使用decimal / numeric而不是float:
SELECT . . .,
(CASE WHEN CAST(Dis, DECIMAL(10, 3)) =
CAST(4.0/count(Id) over (partition by Sym, Month) AS DCIMAL(10, 3) = 0
THEN 'EQUAL'
ELSE 'NOTEQUAL'
END)
FROM RegularPayResultsYearly
请注意表达式4/COUNT(ID) OVER (PARTITiON BY Sym, Month)
将返回一个整数(并且可能返回0)。当两个操作数都是整数时,SQL Server会进行整数除法。
答案 1 :(得分:0)
在下面的代码中,否则,如果我不想传递'NOTEQUAL'并传递浮点NULL值怎么办
SELECT . . .,
(CASE WHEN CAST(Dis, DECIMAL(10, 3)) =
CAST(4.0/count(Id) over (partition by Sym, Month) AS DCIMAL(10, 3) = 0
THEN 'EQUAL'
ELSE 'NOTEQUAL'
END)
FROM RegularPayResultsYearly