【问题标题】:Convert single row to multiple columns Vertica将单行转换为多列 Vertica
【发布时间】:2018-01-30 05:39:12
【问题描述】:
SELECT ID,NAME,VALUE1,VALUE2 FROM my_table where ID=1 ;

查询会给我类似的输出

ID|NAME|VALUE1|VALUE2
1|XYZ|123|325

但我想要以下格式的输出

ID    |1
NAME  |XYZ
VALUE1|123
VALUE2|325

我的列将被固定,每次结果都是单行,如何修改查询以获得以下结果?

【问题讨论】:

  • 您可以这样做,但最好在客户端程序中对数据进行透视。
  • 检查我对unpivot 的实现。根据您的需要进行修改。
  • 如果不为所有内容编写联合,我不相信有任何开箱即用的 v-sql 功能。就像@sKwa 建议的那样,您可以加载自定义 UDF 并以这种方式取消透视。相关讨论在这里:forum.vertica.com/discussion/219577/…
  • @colinwurtz,实际上我已经做到了here。但谁在乎呢?
  • @sKwa 很漂亮,我可以试试用这个

标签: sql vertica


【解决方案1】:

检查this 示例,它完全符合您的需要。

评论更新:

但是如果我有多个列和行,我该如何转置

我的 UDF 将对每一行进行转置/反透视,例如:

daniel=> select * from test limit 4;
 user_id | day_of_week | to_sample
---------+-------------+-----------
       1 |           1 |         1
       1 |           2 |         2
       2 |           1 |         1
       2 |           2 |         2
(4 rows)

daniel=> select unpivot(*) over () from test limit 8;
     KEY     | VALUE
-------------+-------
 user_id     | 1
 day_of_week | 1
 to_sample   | 1
 user_id     | 1
 day_of_week | 2
 to_sample   | 2
 user_id     | 2
 day_of_week | 1
(8 rows)

【讨论】:

  • 谢谢你,但如果我有多个列和行,我该如何转置
  • @Swathi8038:你什么意思?你能举个例子吗?或者,如果缺少某些功能,您可以在 GitHub 上开票吗?我的 UDF 将为每一行执行unpivot
  • @Swathi8038:打开一个新问题,因为您要问的功能是PIVOT 而不是UNPIVOT
【解决方案2】:

应该符合 ANSI 的一种方法是仅使用一系列联合:

SELECT 'ID' AS key, ID AS value FROM my_table WHERE ID=1
UNION ALL
SELECT 'NAME', NAME FROM my_table WHERE ID=1
UNION ALL
SELECT 'VALUE1', VALUE1 FROM my_table WHERE ID=1
UNION ALL
SELECT 'VALUE2', VALUE2 FROM my_table WHERE ID=1;

如果您还需要在预期输出中精确排序,那么我们可以将计算排序列添加到联合查询,然后子查询并按此排序。

【讨论】:

  • 试过这种方法,但如果我有更多的列,它可能会变得乏味
【解决方案3】:

这也应该有效

SELECT StringTokenizerDelim((ID || ',' || NAME || ',' || VALUE1 || ',' || VALUE2), ',') over (partition by null) FROM my_table where ID = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2022-07-24
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多