【问题标题】:Concatenate multiple rows into a single column in teradata sql在 teradata sql 中将多行连接成一列
【发布时间】:2020-11-03 05:25:36
【问题描述】:

谁能帮忙看看下面的例子,非常感谢

id   color   date 

1    red     01/01
1    red     01/02
1    yellow  01/03
1    red     02/01
2    red     01/01
2    blue    01/02
2    blue    02/02
3    red     01/01
4    red     02/01

理想的输出应该是:

id    pattern 
1     (red, yellow) to (red)
2     (red, blue) to (blue)
3     (red)
4     (red)

结果显示两件事:

  1. 一个月内的独特模式
  2. 应在时间范围内将模式聚合在一起

例如,我们可以看到 id_1 在 1 月有一个模式从(红色,黄色)更改,但在 2 月,它只有一个模式(红色)。因此最终的输出应该是 (red,yellow) to (red)

我现在的查询是

select drv.id, extract(month from date) as month,
trim(trailing',' from (XMLAGG(TRIM(color)',' order by date)(varchar(10000)))) as pattern from
(select id, color,
lag(color)over(partition by id, extract(month from date) order by date) as prev_color
from table
qualify prev_color <> color
) as drv
group by id, extract(month from date)

查询不完整,返回如下结果, 但是可以按月退吗?

有没有什么方法可以混合使用 XMLAGG 和分区?

任何人都可以提供任何想法吗?非常感谢!

【问题讨论】:

  • 继续。尝试一下。
  • @gig.d 在寻求帮助之前,您最好阅读this
  • 要使用 XMLAGG,您需要一个 GROUP BY。为什么不在内部派生表查询中过滤掉“无变化”行? QUALIFY color &lt;&gt; prev_color。另外:您需要在列值和分隔符之间使用连接运算符||。 (如果您更喜欢 - 而不是 ,,那么只需在两个地方更改该文字字符串。)

标签: teradata teradata-sql-assistant


【解决方案1】:

您需要在外部查询中使用GROUP BY id。在内部查询中,您可以过滤掉“无变化”行,但还需要包含日期列,以便您可以在外部查询中引用它。默认情况下,XMLAGG 在项目之间添加一个空格,但只要值中没有空格,您就可以轻松地将其转换为您喜欢的任何分隔符。 (如果可以嵌入空格,那么您可以使用连接运算符|| 为每个条目附加一个分隔符并修剪最后一个等)

select drv.id, 
oreplace(XMLAGG(TRIM(color) order by theDate)(varchar(10000)),' ','-') as pattern from
(select id, color, theDate,
lag(color)over(partition by id order by theDate) as prev_color
from theTable
qualify prev_color is null or prev_color <> color
) as drv
group by 1
order by 1

我在本例中使用了theDatetheTable,因为DATETABLE 是保留字。

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2020-09-24
    • 1970-01-01
    • 2021-10-15
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多