如何在 Teradata 中将 2 行合并为单行

How to combine 2 rows into single row in Teradata

我有一个 SQL:

返回的以下形式的结果集
ID   Key
1    A 
2    A
3    A

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

Key ID1 ID2 ID3
A   1   2   3

如何为此构建 SQL?

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

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

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

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