通过 Netezza 查询将行折叠成单个字段

Len*_*ood 1 sql netezza

我正在处理一个以长/高格式存储变量的表。我需要将其转换为宽格式以在项目中使用。基本上我需要聚合一个文本字段,或者按名称折叠。下面是示例数据,我正在使用的表有大约 400k 行:

IID     NAME  LANGUAGE  TID
  1  William   English   76
  1  William    French   82
  1  William   Spanish   12
  1  William    German   63
  2   George    German   39
  2   George    French   53
  3     Dave   English   29
Run Code Online (Sandbox Code Playgroud)

我需要获取的是每个个人 ID/姓名的一行,其中一个字段列出了该个人所说的所有语言。我不需要考虑交易 ID。

IID     NAME                      LANGUAGES
  1  William  English_French_German_Spanish
  2   George                  French_German
  3     Dave                        English
Run Code Online (Sandbox Code Playgroud)

我的数据库是 Netezza,它是 PostgreSQL 的衍生品。我创建了一个使用 PostgreSQL 的 SQL fiddle。我已经成功捕获了其中两种语言,但我的查询遗漏了超过 2 种语言,并且在只有 1 种语言时显示双倍。任何人都可以为我指出正确的方向吗?

http://sqlfiddle.com/#!15/55706/1

SELECT T1.IID, T1.NAME,
    MIN(T1.LANGUAGE) || '_' || MAX(T1.LANGUAGE) AS LANGUAGES

FROM Table1 AS T1

GROUP BY T1.IID, T1.NAME

ORDER BY T1.IID
;
Run Code Online (Sandbox Code Playgroud)

Len*_*ood 6

我在Dhaval 的答案中搜索有关该命令的文档时遇到了答案。IBM DeveloperWorks 社区上的一个帖子Group Concat in Netezza专门解决了这个问题。对我有用的解决方案位于Diwakar Nahata编写的第 5 个响应中。这是为我解决这个问题的代码:

SELECT A.IID, A.NAME,
    RTRIM(MAX(CASE RNO WHEN 1 THEN A.LANGUAGE ELSE '' END)||','|| 
        MAX(CASE RNO WHEN 2 THEN A.LANGUAGE ELSE '' END)||','||
        MAX(CASE RNO WHEN 3 THEN A.LANGUAGE ELSE '' END)||','||
        MAX(CASE RNO WHEN 4 THEN A.LANGUAGE ELSE '' END)||','||
        MAX(CASE RNO WHEN 5 THEN A.LANGUAGE ELSE '' END)||','||
        MAX(CASE RNO WHEN 6 THEN A.LANGUAGE ELSE '' END),',') AS LANGUAGES
FROM (SELECT
        IID,
        NAME,
        LANGUAGE,
        ROW_NUMBER()
        OVER (PARTITION BY IID, NAME ORDER BY LANGUAGE) AS RNO
    FROM Table1 ) AS A
GROUP BY A.IID, A.NAME
;
Run Code Online (Sandbox Code Playgroud)

这是已解决的SQL fiddle的链接。这个小提琴设置为 PostgreSQL,但这个查询在 Netezza 中也非常适合我。