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