简体   繁体   中英

Out of range integer: infinity

So I'm trying to work through a problem thats a bit hard to explain and I can't expose any of the data I'm working with but what Im trying to get my head around is the error below when running the query below - I've renamed some of the tables / columns for sensitivity issues but the structure should be the same

"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

I know the query works for sure because when I get rid of the first CTE and hard code 2 id's into a where clause i commented out it returns the data I want. But I also need it to run based on the 1st CTE which has ~5k unique id's

Here is a sample output if i try with 2 id's:

在此处输入图像描述

Based on the above number of row returned per id I would expect it should return 5000 * 3 rows = 150000.

What could be causing the out of range for integer error?

This line is likely your problem:

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

When the value of c2.score is 0, 1.0/c2.score will be infinity and will not fit into an integer type that you're trying to cast it into.

The reason it's working for the two users in your example is that they don't have a 0 value for c2.score.

You might be able to fix this by changing to:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM