【问题标题】:Redshift REGEXP_SUBSTR get last occurrence of a matchRedshift REGEXP_SUBSTR 获取最后一次匹配
【发布时间】:2020-05-29 09:04:51
【问题描述】:

我在使用 listagg 方法获得的按时间 asc 排序的列值中有一个所有类型的页面事件列表。 listagg(page,';') within group (order by time)

我想获取与正则表达式匹配的最后一个匹配项的出现 regexp_substr(event_list,'/step[0-9]+[^;]*')

根据文档“一个正整数,表示在 source_string 中开始搜索的位置。该位置基于字符数,而不是字节数,因此多字节字符被计为单个字符。默认值为 1。如果position 小于 1,从 source_string 的第一个字符开始搜索。如果 position 大于 source_string 的字符数,则结果为 source_string。"

基于此,我需要知道我不知道的确切出现次数。 在这种情况下如何获得最后一场比赛? 例如: /step1;somethging;somethig;/step2;something;/step3;something;

我要匹配 step3。

PS:按时间顺序排序并获得第一场比赛不是这里的选择。

【问题讨论】:

    标签: sql amazon-redshift data-warehouse regexp-substr listagg


    【解决方案1】:

    使用regexp_count 确定有多少匹配项 (n),然后使用regexp_substr 获取nth 匹配项。

    select 
      '/step1;somethging;somethig;/step2;something;/step3;something;' string
    , '/step[0-9]+[^;]*' pat
    , regexp_count(string, pat) n
    , regexp_substr(string, pat, 1, n) last_part
    

    输出:

                                                           string                pat    n    last_part
    /step1;somethging;somethig;/step2;something;/step3;something;   /step[0-9]+[^;]*    3       /step3
    

    如果 / 可以被视为分隔符,那么您也可以采用以下策略

    反转字符串,由/ 分割并取第一部分。再次反转,前缀/并应用正则表达式提取步骤:

    示例:

    select 
      '/step1;somethging;somethig;/step2;something;/step3;something;' string
    , '/' || reverse(split_part(reverse(string), '/', 1)) last_part
    , regexp_substr(last_part, '/step[0-9]+[^;]*') extract_step
    

    输出:

                                                           string           last_part   extract_step 
    /step1;somethging;somethig;/step2;something;/step3;something;   /step3;something;         /step3 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-30
      • 2015-03-20
      • 2015-01-23
      • 2016-09-21
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多