如何在 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 |
+------------+-----+-----+-----+
一个基于窗口聚合的解决方案,在解释中有一个统计步骤:
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
我有一个 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 |
+------------+-----+-----+-----+
一个基于窗口聚合的解决方案,在解释中有一个统计步骤:
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