【问题标题】:Redshift LISTAGG frame clauseRedshift LISTAGG 框架子句
【发布时间】:2018-03-21 21:02:13
【问题描述】:

我正在尝试聚合字符串,但仅限于前面的行,而不是整个分区。有谁知道如何在 Redshift 中做到这一点?

我想要实现的是下面的appended_event_namespace 列。

这是我迄今为止尝试过的。

LISTAGG(event_namespace, '/')
WITHIN GROUP (ORDER BY tstamp_true)
OVER (PARTITION BY acct_id) AS appended_event_namespace

这会在每一行上生成完整的 ApplicationLaunch/CategoryBrowse/NotificationCenter/UserProfile 聚合,而不是所需屏幕截图中的内容。

困难在于让它只追加到当前行,因为 Redshift 的 LISTAGG() 似乎没有框架子句。感谢您提供任何可能有帮助的想法。

【问题讨论】:

  • Redshift 不支持该功能。

标签: sql amazon-redshift


【解决方案1】:

您可以将其与另一个查询一起破解。从作为原始LISTAGG 的结果的 appended_event_namespace 开始

SELECT event_namespace,
  SUBSTRING(appended_event_namespace,
            1, 
            POSITION(event_namespace,appended_event_namespace) + LEN(event_namespace) - 1
  ) as appended_event_namespace_cum
FROM your_table;

基本上,您获取聚合的有序字符串,然后获取 N 所在的前 N ​​个字符([它出现在聚合字符串中的位置]+[其长度]),这将删除该项目之后的所有内容。这为您提供了一个累积命名空间。

【讨论】:

  • 感谢@Pdubbs。我的示例可能不够清楚,但如果用户在组件之间循环,他们可以构建像 CategoryBrowse/NotificationCenter/CategoryBrowse 这样的命名空间链。那么子字符串匹配就不知道要截断哪一个。
  • 啊,那更难了。我现在没有红移集群:REGEX_SUBSTR(appended_event_namespace,'[^.]*'||event_namespace) 返回什么(试图选择以当前项目结尾的任意字符串)?
  • 在使用 Redshift 时,我总是在尝试为 REGEXP_SUBSTR() 中的模式字段进行连接时遇到问题。它总是抱怨需要一个有效的 UTF-8 文字。如果我使用[^.]*CategoryBrowse 对示例进行硬编码,它将返回以CategoryBrowse 结尾的最长字符串。它可能与稍后发生的 CategoryBrowse 匹配。
【解决方案2】:

LISTAGG with frame 子句在 RS 中尚不支持。如果您有一些列可用于分区和排序,则可以进行自联接(性能不高,但可以完成您想要的操作):

SELECT 
 t1.id
,t2.tstamp_true
,t1.event_namespace
,LISTAGG(t2.event_namespace,'/') WITHIN GROUP (ORDER BY t2.tstamp_true)
FROM your_table t1
JOIN your_table t2
ON t1.id=t2.id
AND t1.tstamp_true>=t2.tstamp_true
GROUP BY 1,2,3

或者,如果您想避免自连接,您可以使用 LISTAGG 构建具有以下结构的 JSON:

[{tstamp_true_1,event_namespace_1},{tstamp_true_N,event_namespace_N},...]

并编写一个 Python UDF,它为给定的行组和给定行的 tstamp_true 获取此类 JSON 并返回路径(该函数需要在第二个参数之前过滤 tstamp_true_N 值并连接过滤event_namespace_N 输出值)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-12-31
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多