[英]How can I unpivot multiple columns using jupyter notebook or SQL?
让我们首先创建一个形状类似于描述中的表格:
CREATE OR REPLACE TABLE weird_table
AS
SELECT 1 AS a, 'b' b, 1 pip1, 2 pip2, 3 pip3, 4 pip4, 11 rip1, 12 rip2, 13 rip3, 14 rip4
UNION ALL SELECT 2 , 'c', 124, 3123, 123, 123, 1231 ,9, 99,999
;
[![enter image description here][1]][1]
现在我们可以使用 JavaScript 在 Snowflake 中创建一个存储过程。 此处脚本获取表的名称。 然后它获取所有以数字结尾的列并使用这些列生成不同的SELECT
语句,并将它们与UNION ALL
合并:
CREATE OR REPLACE PROCEDURE custom_unpivot(TABLE_NAME VARCHAR)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
sqlText: "SELECT * FROM " + TABLE_NAME + " LIMIT 1;",
});
stmt.execute();
var cols=[];
for (i = 1; i <= stmt.getColumnCount(); i++) {
cols.push(stmt.getColumnName(i));
}
var idCols = cols.filter(x => !x.match(/[0-9]+$/));
var unpivotCols = cols.filter(x => x.match(/[0-9]+$/));
var maxUnpivot = Math.max(...unpivotCols.map(x => parseInt(x.match(/[0-9]+$/))));
var colsSansSuffix = [...new Set(unpivotCols.map(x => x.replace(/[0-9]+$/, '')))];
selectsToUnion = [];
for (i = 1; i <= maxUnpivot; i++) {
selectsToUnion.push(
"SELECT "+idCols+","+colsSansSuffix.map(x=>" "+x+i+" AS "+x)+" FROM "+TABLE_NAME
);
}
return selectsToUnion.join('\nUNION ALL\n');
$$
;
当您调用该过程时,它会返回一个组合的SELECT
语句,该语句为您提供所需的“unpivot”:
CALL custom_unpivot('weird_table');
SELECT A,B, PIP1 AS PIP, RIP1 AS RIP FROM weird_table
UNION ALL
SELECT A,B, PIP2 AS PIP, RIP2 AS RIP FROM weird_table
UNION ALL
SELECT A,B, PIP3 AS PIP, RIP3 AS RIP FROM weird_table
UNION ALL
SELECT A,B, PIP4 AS PIP, RIP4 AS RIP FROM weird_table
如果您运行生成的 SQL,它会产生所需的结果:
一旦您了解此模式在存储过程中的工作方式,那么可能性是无穷无尽的。
对于评论中的后续操作,请尝试将结果查询嵌入到这样的过滤器中:
SELECT *
FROM (
SELECT A,B, PIP1 AS PIP, RIP1 AS RIP FROM A_weird_table
UNION ALL
SELECT A,B, PIP2 AS PIP, RIP2 AS RIP FROM A_weird_table
UNION ALL
SELECT A,B, PIP3 AS PIP, RIP3 AS RIP FROM A_weird_table
UNION ALL
SELECT A,B, PIP4 AS PIP, RIP4 AS RIP FROM A_weird_table
UNION ALL
SELECT A,B, PIP5 AS PIP, RIP5 AS RIP FROM A_weird_table
)
WHERE pip>0 AND rip>0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.