when possible values are known in advance and there are not that many of them to write manually SQL - you can use below:
SELECT
userid,
ts,
MAX(IF(params.name = "a", params.value, NULL)) WITHIN RECORD a,
MAX(IF(params.name = "b", params.value, NULL)) WITHIN RECORD b,
MAX(IF(params.name = "c", params.value, NULL)) WITHIN RECORD c
FROM yourTable
If possible values are "unknown" in advance and/or dynamic from run to run, you can use below helper SQL to generate above type of SQL.
SELECT 'select userid, ts, ' +
GROUP_CONCAT_UNQUOTED(
'max(if(params.name = "' + STRING(params.name) + '", params.value, null))
WITHIN RECORD as [' + STRING(params.name) + ']'
)
+ ' from yourTable '
FROM (SELECT params.name FROM yourTable GROUP BY params.name)