Sql 在正则表达式中查找最后一个字符串(日期)的第二个匹配项

Sql 在正则表达式中查找最后一个字符串(日期)的第二个匹配项,sql,regex,google-bigquery,Sql,Regex,Google Bigquery,我得到了以下字符串: (1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;); 或 我需要将这第二个日期返回到最后一个日期,因此在这些情况下,例如1:03/12/2018和2:05/30/2018 因为有很多以字母结尾的字符串部分;我不太明白如何才能得到最后一次约会。我想这正是你想要的: select (select array_ag

我得到了以下字符串:

(1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;);

我需要将这第二个日期返回到最后一个日期,因此在这些情况下,例如1:03/12/2018和2:05/30/2018


因为有很多以字母结尾的字符串部分;我不太明白如何才能得到最后一次约会。

我想这正是你想要的:

select (select array_agg(val order by o desc limit 2)  -- the limit is just for efficiency
        from unnest(split(str, ';')) val with offset o
        where val like '%/%/%'
       )[ordinal(2)] a
from (select '1640.31; 08/19/2016; 09/13/2016;' as str) x;

请注意,如果圆括号真的是字符串的一部分,这也(碰巧)适用于圆括号。

我认为这符合您的要求:

select (select array_agg(val order by o desc limit 2)  -- the limit is just for efficiency
        from unnest(split(str, ';')) val with offset o
        where val like '%/%/%'
       )[ordinal(2)] a
from (select '1640.31; 08/19/2016; 09/13/2016;' as str) x;

请注意,如果圆括号真的是字符串的一部分,这也(碰巧)适用于圆括号。

下面是BigQuery标准SQL的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '(1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;);' AS str UNION ALL
  SELECT '(1000000.0; 05/30/2018; 06/03/2028;);'
)
SELECT ARRAY_REVERSE(REGEXP_EXTRACT_ALL(str, r'\d\d/\d\d/\d\d\d\d'))[SAFE_OFFSET(1)] dt
FROM `project.dataset.table`   
结果:

Row dt   
1   03/12/2018   
2   05/30/2018   

注:以上假设日期始终为mm/dd/yyyy或dd/mm/yyyy格式,但如果不同,则可以进行调整,例如BigQuery标准SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '(1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;);' AS str UNION ALL
  SELECT '(1000000.0; 05/30/2018; 06/03/2028;);'
)
SELECT ARRAY_REVERSE(REGEXP_EXTRACT_ALL(str, r'\d\d/\d\d/\d\d\d\d'))[SAFE_OFFSET(1)] dt
FROM `project.dataset.table`   
结果:

Row dt   
1   03/12/2018   
2   05/30/2018   

注:以上假设日期始终为mm/dd/yyyy或dd/mm/yyyy格式,但如果日期始终为
mm/dd/yyyy,则可以进行调整具有精确的2、2和4位数字,正斜杠分隔符,分号终止?
\(.+;([0-9]{2}\/[0-9]{2}\/[0-9]{4});([0-9]{2}\/[0-9]{2}\/[0-9]{4});)将给出三组(外部、第一组和第二组)日期始终
mm/dd/yyyy具有精确的2、2和4位数字,正斜杠分隔符,分号终止?
\(.+;([0-9]{2}\/[0-9]{2}\/[0-9]{4});([0-9]{2}\/[0-9]{2}\/[0-9]{4});)将给出三组(外部、第一组和第二组)