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

时间:2018-06-28 19:18:00

标签: sql netezza

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

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

我需要为每个个人ID /名称输入一行,并在其中列出该个人使用的所有语言。我不需要考虑交易ID。

IID     NAME                      LANGUAGES
  1  William  English_French_German_Spanish
  2   George                  French_German
  3     Dave                        English

我的数据库是Netezza,它是PostgreSQL的派生产品。我创建了一个使用PostgreSQL的SQL提琴。我已经设法捕获了两种语言,但是我的查询漏掉了两种以上的语言,当只有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
;

2 个答案:

答案 0 :(得分:1)

尝试使用group_concat 您的查询将类似于:

SELECT T1.IID, T1.NAME,
    GROUP_CONCAT(T1.LANGUAGE,'_') AS LANGUAGES
FROM Table1 AS T1
GROUP BY T1.IID, T1.NAME
ORDER BY T1.IID;

博客link,可帮助您更好地了解此分析功能

希望有帮助

答案 1 :(得分:0)

我在Dhaval's答案中搜索有关命令的文档时遇到了答案。 IBM的DeveloperWorks社区中有一个线程可以解决这个确切的问题Group Concat in Netezza。对我有用的解决方案位于5th response编写的Diwakar Nahata中。这是为我解决的代码:

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
;

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