0
panel alert date
X [{"name":"x1","user_text":"","user_text_overflow":""},{"name":"y1","user_text":"","user_text_overflow":""},{"name":"z1","user_text":"","user_text_overflow":""}] 2024-12-10
X [{"name":"x2","user_text":"","user_text_overflow":""},{"name":"x1","user_text":"","user_text_overflow":""},{"name":"z2","user_text":"","user_text_overflow":""}] 2024-12-10
X [{"name":"x1","user_text":"","user_text_overflow":""},{"name":"x2","user_text":"","user_text_overflow":""},{"name":"x3","user_text":"","user_text_overflow":""}] 2024-12-11

Given the table above, I am trying to extract the "name" value when its set to "x1". I have tried using json_extract_scalar but I keep getting NULL values. I also want to get a sum of the number of times "name" is "x1" on a given date

The expected outcome given the example above should be:

panel name = x1 date
X 2 2024-12-10
X 1 2024-12-11
1
  • Please show your attempt. Commented Dec 18, 2024 at 22:29

1 Answer 1

0

Probably a few good ways to do this with Trino, but my mind likes to think in classic wide tables, so the answer below (see https://hafizbadrie.medium.com/prestodb-convert-json-array-of-objects-into-rows-d9c916724dfc for more descriptions of what is going on) should work for you...

-- create 3 rows of the test data 
WITH fake_table AS (
select 'X' AS panel, 
       '[{"name":"x1","user_text":"","user_text_overflow":""},{"name":"y1","user_text":"","user_text_overflow":""},{"name":"z1","user_text":"","user_text_overflow":""}]' AS alert,
       '2024-12-10' AS the_date
UNION
select 'X' AS panel, 
       '[{"name":"x2","user_text":"","user_text_overflow":""},{"name":"x1","user_text":"","user_text_overflow":""},{"name":"z2","user_text":"","user_text_overflow":""}]' AS alert,
       '2024-12-10' AS the_date
UNION
select 'X' AS panel, 
       '[{"name":"x1","user_text":"","user_text_overflow":""},{"name":"x2","user_text":"","user_text_overflow":""},{"name":"x3","user_text":"","user_text_overflow":""}]' AS alert,
       '2024-12-11' AS the_date
),

-- unwind it all to a deep and wide table representation
flattened_out_alerts AS (
select panel, the_date, 
       alert['name'] AS alert_name,
       alert['user_text'] AS alert_user_text,
       alert['user_text_overflow'] AS alert_user_text_overflow
  from (
        select panel, the_date,
               cast(json_extract(alert, '$') AS ARRAY<MAP<VARCHAR,VARCHAR>>) AS alerts
  from fake_table
  )
cross join UNNEST(alerts) AS alerts(alert)
)

-- run a normal group_by query
select the_date, alert_name, count(alert_name) AS the_count
  from flattened_out_alerts
 where alert_name = 'x1'
 group by the_date, alert_name;

It returns the following.

the_date alert_name the_count
2024-12-11 x1 1
2024-12-10 x1 2
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.