超出范围的整数:无穷大

Out of range integer: infinity

所以我正在努力解决一个有点难以解释的问题,而且我无法公开我正在使用的任何数据,但我试图解决的是以下错误运行在下面的查询中 - 我已经重命名了一些表/列以解决敏感性问题,但结构应该相同

"Error from Query Engine - Out of range for integer: Infinity"

WITH accounts AS (

  SELECT t.user_id

  FROM table_a t
  WHERE t.type like '%Something%'

),

CTE AS (

 SELECT 

 st.x_user_id,
 ad.name as client_name,
 sum(case when st.score_type = 'Agility' then st.score_value else 0 end) as score,
 st.obs_date,
 ROW_NUMBER() OVER (PARTITION BY st.x_user_id,ad.name ORDER BY st.obs_date) AS rn

 FROM client_scores st

 LEFT JOIN account_details ad on ad.client_id = st.x_user_id
 INNER JOIN accounts on st.x_user_id = accounts.user_id

--WHERE st.x_user_id IN (101011115,101012219)

 WHERE st.obs_date >= '2020-05-18'

 group by 1,2,4
  )

SELECT

 c1.x_user_id,
 c1.client_name,
 c1.score,
 c1.obs_date,
 CAST(COALESCE (((c1.score - c2.score) * 1.0 / c2.score) * 100, 0) AS INT) AS score_diff


FROM CTE c1

LEFT JOIN CTE c2 on c1.x_user_id = c2.x_user_id and c1.client_name = c2.client_name and c1.rn = c2.rn +2

我知道查询肯定有效,因为当我去掉第一个 CTE 并将硬编码 2 id 放入 where 子句时,我将其注释掉 returns 我想要的数据。但我还需要它 运行 基于第一个 CTE,它有 ~5k 唯一 id's

这是我尝试使用 2 个 ID 时的示例输出:

根据上面每个 id 的行数 return,我预计它应该 return 5000 * 3 行 = 150000。

什么可能导致整数错误超出范围?

这一行可能是您的问题:

CAST(COALESCE (((c1.score - c2.score) * 1.0 / c2.score) * 100, 0) AS INT) AS score_diff

当 c2.score 的值为 0 时,1.0/c2.score 将为无穷大并且不适合您尝试将其转换为的整数类型。

它对您示例中的两个用户有效的原因是他们没有 c2.score 的 0 值。

您可以通过更改为:

来解决此问题
CAST(COALESCE (((c1.score - c2.score) * 1.0 / NULLIF(c2.score, 0)) * 100, 0) AS INT) AS score_diff