SQL 每个事件生成新行的函数?
SQL function to generate new row per event?
我在这里寻找答案无济于事;想知道这个问题是否最适合 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 来突破这个领域取得了一些成功,但无法将它放到自己的行中。
Vertica 为此提供 tokenizer function StringTokenizerDelim
作为文本搜索包的一部分:
select id, date, words as event
from (
select id, date, StringTokenizerDelim(event, ',') over (partition by id)
from mytable
) t
确实按照@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
我在这里寻找答案无济于事;想知道这个问题是否最适合 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 来突破这个领域取得了一些成功,但无法将它放到自己的行中。
Vertica 为此提供 tokenizer function StringTokenizerDelim
作为文本搜索包的一部分:
select id, date, words as event
from (
select id, date, StringTokenizerDelim(event, ',') over (partition by id)
from mytable
) t
确实按照@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