sql - Sql:使用动态列列表取消透视
问题描述
我希望在 sql 中做一些反透视,将键值转换为 ID 列表。表格中的列是动态的,每周都会更改(甚至可能每天更改)。哪里可能有更多的关键列和值的可能性。
DATABASE.PUBLIC.IMPORT_TABLE
+-----------+--------+--------+--------+
| SOURCE_ID | KEY1 | KEY2 | [KEY3] |
+-----------+--------+--------+--------+
| 0001 | TRUE | FALSE | [TBD] |
| 0002 | TRUE | FALSE | [TBD] |
| 0003 | TRUE | TRUE | [TBD] |
| 0004 | TRUE | TRUE | [TBD] |
| 0005 | FALSE | TRUE | [TBD] |
+-----------+--------+--------+--------+
为了管理可能的组合,有一个表来管理键值对,并给它们一个 ID。此表用于管理我感兴趣的列。有时如果添加了其他列而不在此表中,则将其排除在外。
DATABASE.PUBLIC.KEY_VALUE_TABLE
+-----------+--------+--------+
| KEY | VALUE | KV_ID |
+-----------+--------+--------+
| KEY1 | TRUE | AAA |
| KEY1 | FALSE | BBB |
| KEY2 | TRUE | CCC |
| KEY2 | FALSE | DDD |
| [KEY3] | [TRUE] | [EEE] |
+-----------+--------+--------+
使用以下查询。我能够实现我正在寻找的 unpivot。但是它没有考虑 KEY_VALUE_TABLE 的动态变化的变化
CREATE OR REPLACE TABLE DATABASE.PUBLIC.FINAL_TABLE AS
SELECT SOURCE_ID
,LISTAGG(DISTINCT b.KV_ID, ',') within group (order by b.KV_ID desc) AS KV_ID
FROM (
SELECT DISTINCT SOURCE_ID, KEY, VALUE from DATABASE.PUBLIC.IMPORT_TABLE
UNPIVOT(VALUE for KEY in (KEY1,KEY2))
) a
LEFT JOIN DATABASE.PUBLIC.KEY_VALUE_TABLE b
ON (a.KEY=b.KEY AND a.VALUE=b.VALUE)
GROUP BY 1,2
结果如下所示 DATABASE.PUBLIC.FINAL_TABLE
+-----------+--------+--------+
| SOURCE_ID | KV_ID |
+-----------+--------+--------+
| 0001 | AAA,DDD |
| 0002 | AAA,DDD |
| 0003 | AAA,CCC |
| 0004 | AAA,CCC |
| 0005 | BBB,CCC |
+-----------+--------+--------+
有没有办法让UNPIVOT(VALUE for KEY in (KEY1,KEY2))
到类似的东西UNPIVOT(VALUE for KEY in (SELECT DISTINCT KEY FROM KEY_VALUE_TABLE))
。注意我已经尝试过后者,但它不起作用。SQLSELECT
在 UNPIVOT中使用时出现问题
我也尝试过使用UNPIVOT(VALUE for KEY in ($KEY_LIST))
Where my variable is SET KEY_LIST = '[KEY1,KEY2]'
=> SET KEY_LIST = (SELECT listagg(KEY, ',') as my_strings FROM DATABASE.PUBLIC.KEY_VALUE_TABLE)
SQL 对变量的大小有限制。
任何意见,将不胜感激。我的下一步是创建存储过程或函数。其中包含外部变量。通过javascript或类似的东西。
解决方案
推荐阅读
- angular - 为什么我的 Mongoose 控制器没有被调用?
- reactjs - 在我的 Redux 设置中没有调用 Reducer
- c++ - 转换为右值后,线程参数必须是可调用的
- javascript - 防止 10 分钟邮件响起(网页)
- python - 如何使用 ctypes 在 Python 中发送 char* 类型参数?
- python - 在 Django 中以 html 模式加载动态数据
- javascript - Node.js 获取字符串中所有出现的子字符串
- pine-script - 是否有自动“价格与柱线比率”计算的公式?
- oauth-2.0 - 在 OpenID Connect with PKCE 中,客户端如何知道用户重定向后使用哪个 code_verifier 发送哪个授权码?
- database - 微服务、数据库关系和缓存