【问题标题】:How to combine 2 rows into single row in Teradata如何在 Teradata 中将 2 行合并为单行
【发布时间】:2017-11-22 01:28:07
【问题描述】:

我有一个由 SQL 返回的以下形式的结果集:

ID   Key
1    A 
2    A
3    A

现在我的要求是以下面的形式显示数据:

Key ID1 ID2 ID3
A   1   2   3

如何为此构建 SQL?

【问题讨论】:

  • Google Pivot teradata。
  • 你知道写查询的时候会有多少列吗?这总是三个值吗?如果是这样,您可以使用 PIVOT 或条件聚合。通常这种显示的事情是你不会在 SQL 中做的,而是在你的应用程序或网站中。
  • 只有一个列ID需要这样显示。
  • @kannam:您使用的是哪个 teradata 版本?
  • 我使用的是 14.10

标签: sql teradata


【解决方案1】:

一个基于窗口聚合的解决方案,在解释中只有一个 STATS 步骤:

SELECT
   key,
   -- value from 1st row = current row
   ID AS ID1,
   -- value from next row, similar to LEAD(ID, 1) Over (PARTITION BY Key ORDER BY ID)
   Min(ID) 
   Over (PARTITION BY Key 
         ORDER BY ID 
         ROWS BETWEEN 1 Following AND 1 Following) AS ID2 ,
   -- value from 3rd row
   Min(ID)
   Over (PARTITION BY Key
         ORDER BY ID
         ROWS BETWEEN 2 Following AND 2 Following) AS ID3
FROM mytable
QUALIFY -- only return the 1st row
   Row_Number()
   Over (PARTITION BY key
         ORDER BY ID) = 1

【讨论】:

    【解决方案2】:

    由于 teradata 14.10 没有 PIVOT 函数,并且假设对于每个唯一的 key,不会有超过 3 个 IDs(如 cmets 中所述),您可以使用 row_number() 和 @ 987654326@ 函数如下以获得您想要的结果。

    SELECT
      key1,
      MAX(CASE WHEN rn = 1 THEN ID END) AS ID1,
      MAX(CASE WHEN rn = 2 THEN ID END) AS ID2,
      MAX(CASE WHEN rn = 3 THEN ID END) AS ID3
      FROM 
      (SELECT
      t.*,
      ROW_NUMBER() OVER (PARTITION BY key1 ORDER BY ID) AS rn
      FROM table1 t) t
      GROUP BY key1;
    

    结果:

    +------------+-----+-----+-----+
    |    key1    | id1 | id2 | id3 |
    +------------+-----+-----+-----+
    | A          |   1 |   2 |   3 |
    +------------+-----+-----+-----+
    

    DEMO

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 2019-01-14
      • 2023-03-05
      相关资源
      最近更新 更多