InlLad
InlLad

Reputation: 69

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:

enter image description here

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?

Upvotes: 0

Views: 2042

Answers (1)

PeterH
PeterH

Reputation: 121

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

Upvotes: 1

Related Questions