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

Posted

技术标签:

【中文标题】通过 Netezza 查询将行折叠成单个字段【英文标题】:Collapse Rows into a Single Field via Netezza Query 【发布时间】:2018-06-28 19:17:59 【问题描述】:

我正在处理一个以长/高格式存储变量的表。我需要将其转换为宽格式以便在项目中使用。基本上我需要聚合一个文本字段,或者按名称折叠。下面的示例数据,我正在使用的表有大约 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 小提琴。我设法捕获了其中两种语言,但我的查询遗漏了超过 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
;

【问题讨论】:

【参考方案1】:

我在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 中也非常适合我。

【讨论】:

【参考方案2】:

尝试使用 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可以帮助你更好地理解这个分析函数

希望对你有帮助

【讨论】:

这对我不起作用,我收到错误 ERROR AGG: PERMISSION DENIED。它确实让我找到了一些我以前没有遇到过的地方,所以你的回答确实有帮助。感谢您抽出宝贵时间。

以上是关于通过 Netezza 查询将行折叠成单个字段的主要内容,如果未能解决你的问题,请参考以下文章

使用单个查询重命名 netezza 中的两列

根据字段进行查询以将行拆分为 x 行

通过 Power Query 在 Excel 中的 Smartsheet 数据

是否有针对 Netezza(Toad 数据点)的查询以查找存在特定字段名称的所有表

JOIN 替代 SELECT 子查询

SQL 将行连接成一个字段 (DB​​2)