【问题标题】:SQL function to generate new row per event?SQL函数为每个事件生成新行?
【发布时间】:2020-09-24 15:59:59
【问题描述】:

我在这里寻找答案无济于事;想知道这个问题是否最适合在 SQL 环境之外,但我想看看它是如何解决的。

我正在尝试查看网络旅程,因此需要我的数据采用以下格式:

ID      DATE       EVENT
1       01/01/20   "Landing Page"
1       01/01/20   "purchase page"
2...etc

目前数据格式如下:

ID       DATE       EVENT
1        01/01/20   "Landing page","purchase page"
2... etc

我基本上想用逗号分隔事件字段,并为每个逗号分隔的事件创建一个新行,并复制所有其他字段。我的 SQL 不是很好,已经尝试了许多临时表、联合和 split_parts 来打破该字段取得一些成功,但无法将其放入自己的行中。

【问题讨论】:

  • 请用您正在运行的数据库标记您的问题:mysql、postgresql、sql-server...?
  • 谢谢,它的 VerticaSQL

标签: sql string csv split vertica


【解决方案1】:

Vertica 为此提供了tokenizer function StringTokenizerDelim,作为文本搜索包的一部分:

select id, date, words as event
from (
    select id, date, StringTokenizerDelim(event, ',') over (partition by id)
    from mytable
) t

【讨论】:

    【解决方案2】:

    确实按照@GMB 的建议工作。

    只是函数StringTokenizerDelim()不在默认搜索路径中。

    您必须使用它所在的 v_txtindex 架构明确限定它:

    WITH
    -- your input
    indata(id,dt,ev) AS (
              SELECT 1, DATE '2020-01-01','landing page,purchase page'
    UNION ALL SELECT 2, DATE '2020-01-02','landingpage,browse-article page,purchase page'
    )
    ,
    tokens AS (
      SELECT
        id
      , dt
      , v_txtindex.StringTokenizerDelim(ev,',') OVER(PARTITION BY id,dt)
      FROM indata
    )
    SELECT
      id
    , dt
    , words AS event
    FROM tokens;
    -- out  id |     dt     |        event        
    -- out ----+------------+---------------------
    -- out   1 | 2020-01-01 | landing page
    -- out   1 | 2020-01-01 | purchase page
    -- out   2 | 2020-01-02 | landingpage
    -- out   2 | 2020-01-02 | browse-article page
    -- out   2 | 2020-01-02 | purchase page
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多