Sql 使用数组元素设置变量
我有一个包含应用程序版本(v1.1.1、v1.1.2、v1.10.1等)的表。 使用Sql 使用数组元素设置变量,sql,google-bigquery,Sql,Google Bigquery,我有一个包含应用程序版本(v1.1.1、v1.1.2、v1.10.1等)的表。 使用REGEXP\u EXTRACT\u ALL,我得到了一个以数字为元素的数组。 知道为什么我不能将每个元素的最大值设置为一个变量吗 这是我使用的代码: DECLARE x DEFAULT 0; SET x = ( SELECT max(REGEXP_EXTRACT_ALL(app_version, "\\d+")[SAFE_ORDINAL(2)]) FROM 'table_with_app
REGEXP\u EXTRACT\u ALL
,我得到了一个以数字为元素的数组。
知道为什么我不能将每个元素的最大值设置为一个变量吗
这是我使用的代码:
DECLARE x DEFAULT 0;
SET x = (
SELECT
max(REGEXP_EXTRACT_ALL(app_version, "\\d+")[SAFE_ORDINAL(2)])
FROM
'table_with_app_version');
感谢下面是BigQuery标准SQL
#standardsql
create temp function normaizedsemanticversion(semanticversion string)
as ((
select string_agg(
if(isdigit, repeat('0', 8 - length(chars)) || chars, chars), '' order by grp
) || '..zzzzzzzzzzzzzz'
from (
select grp, isdigit, string_agg(char, '' order by offset) chars,
from (
select offset, char, isdigit,
countif(not isdigit) over(order by offset) as grp
from unnest(split(semanticversion, '')) as char with offset,
unnest([char in ('1','2','3','4','5','6','7','8','9','0')]) isdigit
)
group by grp, isdigit
)));
create temp function comparesemanticversions(
normsemanticversion1 string,
normsemanticversion2 string)
as ((
select
case
when v1 < v2 then 'v2 newer than v1'
when v1 > v2 then 'v1 newer than v2'
else 'same versions'
end
from unnest([struct(
normaizedsemanticversion(normsemanticversion1) as v1,
normaizedsemanticversion(normsemanticversion2) as v2
)])
));
with test as (
select 'v1.0.0-alpha' version union all
select 'v1.0.0-alpha.1' union all
select 'v1.0.0-alpha.beta' union all
select 'v1.0.0-beta' union all
select 'v1.0.0-beta.2' union all
select 'v1.0.0-beta.11' union all
select 'v1.0.0-rc.1' union all
select 'v1.0.0' union all
select 'v1.1.1' union all
select 'v1.1.2' union all
select 'v1.10.1'
)
select string_agg(version order by normaizedsemanticversion(version) desc limit 1)
from test
SQL Server不是BigQuery?希望,这就是您要找的。考虑接受,然后投票回答:O)
select version
from test
order by normaizedsemanticversion(version) desc
limit 1