【问题标题】:query to remove everything between 1st and 2nd hypen for string in column查询以删除列中字符串的第一个和第二个连字符之间的所有内容
【发布时间】:2022-10-06 13:14:23
【问题描述】:

我正在尝试根据自定义字段检索记录 \"词库\"。对于 \" 的相同值词库\" 我们将有多个 \"l1m_visits\",我想检索\"的最小值l1mvisits\" 对于每个 \"词库\"。我想得到词库通过删除第一个和第二个下划线(-)之间的字符串, 如何在这里写一个查询来获取 ci_ku

样本数据

item l1m_visits
1234 A
1234 B
56457 D

预期产出

ku ci_ku l1m_visits
1234-5678-HIJK 1234-HIJK A
56457-12456-DF-GH-TC 56457-DF-GH-TC D

已尝试以下查询:

WITH tab_with_ci_ku AS (
   select split(ku, \'-\', 3)ivm_arr,

           l1m_visits,
           last_refresh_date
    FROM db.scema.table
), ranked_visits AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY CONCAT(ivm_arr[2],item) as ci_sku ORDER BY l1m_visits) AS rn
    FROM tab_with_ci_ku
)
SELECT sku,ci_ku
FROM ranked_visits
WHERE rn = 1

并面临以下错误:

 mismatched input \'ci_ku\'. Expecting: \'ALTER\', \'ANALYZE\', \'CALL\', \'COMMENT\', \'COMMIT\', \'CREATE\', \'DEALLOCATE\', \'DELETE\', \'DENY\', \'DESC\', \'DESCRIBE\', \'DROP\', \'EXECUTE\', \'EXPLAIN\', \'GRANT\', \'INSERT\', \'MERGE\', \'PREPARE\', \'REFRESH\', \'RESET\', \'REVOKE\', \'ROLLBACK\', \'SET\', \'SHOW\', \'START\', \'TRUNCATE\', \'UPDATE\', \'USE\', <query>

    标签: sql postgresql psql presto


    【解决方案1】:

    我会使用正则表达式替换来处理ci_ku 要求。请注意,这种替换应该发生第一的,因为对ROW_NUMBER 的调用取决于它。

    WITH tab_with_ci_ku AS (
        SELECT *, REGEXP_REPLACE(ku, '([^-]+)-[^-]+-(.*)', '$1-$2') AS ci_ku
        FROM db.schema.table
    ),
    ranked_visits AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY ci_ku ORDER BY l1m_visits) AS rn
        FROM tab_with_ci_ku
    )
    
    SELECT ku, ci_ku, l1m_visits
    FROM ranked_visits
    WHERE rn = 1;
    

    这是正则表达式的解释:

    • ([^-]+) 匹配并捕获$1 第一项
    • - 匹配文字连字符
    • [^-]+匹配第二个词(替换中排除)
    • - 匹配文字连字符
    • (.*) 匹配并捕获$2 SKU 的其余部分

    然后我们用$1-$2 替换以有效地拼接出第二项。

    【讨论】:

    • 嗨@Tim Biegeleisen,非常感谢您的回复,它工作正常,您能否解释一下这个正则表达式的工作原理:'([^-]+)-[^-]+-(.*)', '$1- $2'
    • 请检查上面的更新答案。
    • 谢谢@Tim Biegeleisen,第一学期使用 [^-] 和第二学期使用 (.*) 的原因是什么
    • @AmulyaM 好吧,最后的(.*) 基本上说要捕获剩余的所有内容。至此,我们已经拼接出了第二项。
    • 好的@Tim Biegeleisen,感谢您的快速回复
    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多