看来您想使用doc 中详述的分析功能
使用OVER 和PARTITION BY 的分析功能,您可以通过值对数据进行分区,然后使用ORDER BY 按日期对其进行排序。现在检查它是否是该分区中的第一行并相应地分配类型。
这个查询应该得到你想要的;
WITH data as(
SELECT "2021-09-01" day,"a" value
UNION ALL ( SELECT "2021-09-01", "b" )
UNION ALL ( SELECT "2021-09-01", "c" )
UNION ALL ( SELECT "2021-09-02", "d" )
UNION ALL ( SELECT "2021-09-02", "a" )
UNION ALL ( SELECT "2021-09-02", "a" )
UNION ALL ( SELECT "2021-09-02", "e" )
UNION ALL ( SELECT "2021-09-03", "c" )
UNION ALL ( SELECT "2021-09-03", "f" )
UNION ALL ( SELECT "2021-09-03", "a" )
)
SELECT day, value,
IF(ROW_NUMBER() OVER (PARTITION BY value ORDER BY day) = 1, 'New','Returning') as type
FROM data
结果
| Row |
day |
value |
type |
| 1 |
2021-09-01 |
a |
New |
| 2 |
2021-09-02 |
a |
Returning |
| 3 |
2021-09-02 |
a |
Returning |
| 4 |
2021-09-03 |
a |
Returning |
| 5 |
2021-09-01 |
b |
New |
| 6 |
2021-09-01 |
c |
New |
| 7 |
2021-09-03 |
c |
Returning |
| 8 |
2021-09-02 |
d |
New |
| 9 |
2021-09-02 |
e |
New |
| 10 |
2021-09-03 |
f |
New |
修改了附加要求
要将具有相同日期的所有分组 values 作为第一个事件提供 New 类型,您可以使用另一个分析函数 FIRST_VALUE 并结合当前日期值。
WITH data as
(SELECT "2021-09-01" day,"a" value
UNION ALL ( SELECT "2021-09-01","b")
UNION ALL ( SELECT "2021-09-01","c")
UNION ALL ( SELECT "2021-09-02","d")
UNION ALL ( SELECT "2021-09-02","a")
UNION ALL ( SELECT "2021-09-01","a")
UNION ALL ( SELECT "2021-09-02","a")
UNION ALL ( SELECT "2021-09-02","e")
UNION ALL ( SELECT "2021-09-03","c")
UNION ALL ( SELECT "2021-09-03","f")
UNION ALL ( SELECT"2021-09-03","a"))
SELECT *,
IF(ROW_NUMBER() OVER (PARTITION BY value ORDER BY day) = 1 OR FIRST_VALUE(day) OVER (PARTITION BY value ORDER BY day) = day, 'New','Returning') as type
FROM data
结果
| Row |
day |
value |
type |
| 1 |
2021-09-01 |
a |
New |
| 2 |
2021-09-01 |
a |
New |
| 3 |
2021-09-02 |
a |
Returning |
| 4 |
2021-09-02 |
a |
Returning |
| 5 |
2021-09-03 |
a |
Returning |
| 6 |
2021-09-01 |
b |
New |
| 7 |
2021-09-01 |
c |
New |
| 8 |
2021-09-03 |
c |
Returning |
| 9 |
2021-09-02 |
d |
New |
| 10 |
2021-09-02 |
e |
New |
| 11 |
2021-09-03 |
f |
New |