请告诉我我是否遗漏了什么,如果我失去理智
以下查询产生零误差
DECLARE @Test TABLE(
ID INT,
Val FLOAT
)
INSERT INTO @Test SELECT 1, 0
;WITH Grouped AS (
SELECT ID,
Val,
SUM(Val) OVER (PARTITION BY ID) TotalVal
FROM @Test
)
, Filtered AS (
SELECT *
FROM Grouped
WHERE TotalVal != 0
)
SELECT *
FROM Filtered
WHERE Val / TotalVal > 0.05
SQL 小提琴演示
如下所示不会产生相同的错误
DECLARE @Test TABLE(
ID INT,
Val FLOAT
)
INSERT INTO @Test SELECT 1, 0
;WITH Grouped AS (
SELECT ID,
Val,
SUM(Val) OVER (PARTITION BY ID) TotalVal
FROM @Test
)
, Filtered AS (
SELECT *
FROM Grouped
WHERE TotalVal != 0
)
SELECT *,
Val / TotalVal Test
FROM Filtered
SQL 小提琴演示
通过查看估计的查询计划,第一个查询尝试将 where 子句优化为
[Val]/[Expr1004]>(5.000000000000000e-002) AND [Expr1004]<>(0.000000000000000e+000)
我可以看到,TotalVal != 0
在实际之后devide by TotalVal
。
这是一个已知的问题?有没有办法(除了使用另一个临时表)绕过这个。我知道我可以使用
CASE WHEN TotalVal = 0 THEN 0 ELSE Val / TotalVal END
但这会破坏第二个 CTE 声明的目的。