从标准 SQL 中的字符串中提取最大的 key:value 对
Extract the highest key:value pair from a string in Standard SQL
我下面有如下数据类型,是116=0.2875
这样的键值对类型。 Big Query 已将其存储为字符串。我需要做的是从每一行中提取密钥,即 116。
为了使事情变得更复杂,如果一行有多个键值对,要提取的迭代是右侧数字最大的迭代,例如 {1=0.1,2=0.8},因此提取的数字将是 2.
我正在努力使用 SQL 来执行此操作,特别是因为有些行有一个值而有些行有多个:
这与我设法达到的目标一样接近,我可以创建一些代码来提取最高的右手值(我不需要),但我似乎无法创建一些东西来获得整个 key/value 对,这对我来说很好,对我有用,或者只是钥匙,那会很棒。
column
,(SELECT MAX(CAST(Values AS NUMERIC)) FROM UNNEST(JSON_EXTRACT_ARRAY(REPLACE(REPLACE(REPLACE(column,"{","["),"}","]"),"=",","))) AS Values WHERE Values LIKE "%.%") AS Highest
from `table`
这是一些示例数据:
1 {99=0.25}
2 {99=0.25}
3 {99=0.25}
4 {116=0.2875, 119=0.6, 87=0.5142857142857143}
5 {105=0.308724832214765}
6 {105=0.308724832214765}
7 {139=0.5712754555198284}
8 {127=0.5767967894928858}
9 {134=0.2530120481927711, 129=0.29696599825632086, 73=0.2662459427947186}
10 {80=0.21242613001118038}
如能就此难题提供任何帮助,我们将不胜感激!
考虑以下方法
select column,
( select cast(split(kv, '=')[offset(0)] as int64)
from unnest(regexp_extract_all(column, r'(\d+=\d+.\d+)')) kv
order by cast(split(kv, '=')[offset(1)] as float64) desc
limit 1
) key
from your_table
如果应用于您问题中的示例数据 - 输出为
我下面有如下数据类型,是116=0.2875
这样的键值对类型。 Big Query 已将其存储为字符串。我需要做的是从每一行中提取密钥,即 116。
为了使事情变得更复杂,如果一行有多个键值对,要提取的迭代是右侧数字最大的迭代,例如 {1=0.1,2=0.8},因此提取的数字将是 2.
我正在努力使用 SQL 来执行此操作,特别是因为有些行有一个值而有些行有多个:
这与我设法达到的目标一样接近,我可以创建一些代码来提取最高的右手值(我不需要),但我似乎无法创建一些东西来获得整个 key/value 对,这对我来说很好,对我有用,或者只是钥匙,那会很棒。
column
,(SELECT MAX(CAST(Values AS NUMERIC)) FROM UNNEST(JSON_EXTRACT_ARRAY(REPLACE(REPLACE(REPLACE(column,"{","["),"}","]"),"=",","))) AS Values WHERE Values LIKE "%.%") AS Highest
from `table`
这是一些示例数据:
1 {99=0.25}
2 {99=0.25}
3 {99=0.25}
4 {116=0.2875, 119=0.6, 87=0.5142857142857143}
5 {105=0.308724832214765}
6 {105=0.308724832214765}
7 {139=0.5712754555198284}
8 {127=0.5767967894928858}
9 {134=0.2530120481927711, 129=0.29696599825632086, 73=0.2662459427947186}
10 {80=0.21242613001118038}
如能就此难题提供任何帮助,我们将不胜感激!
考虑以下方法
select column,
( select cast(split(kv, '=')[offset(0)] as int64)
from unnest(regexp_extract_all(column, r'(\d+=\d+.\d+)')) kv
order by cast(split(kv, '=')[offset(1)] as float64) desc
limit 1
) key
from your_table
如果应用于您问题中的示例数据 - 输出为