Sql 一行中有多行(model.matrix等效)
我有一个带有用户id和一些值的表:Sql 一行中有多行(model.matrix等效),sql,postgresql,amazon-redshift,Sql,Postgresql,Amazon Redshift,我有一个带有用户id和一些值的表: user_id | type | amount --------------------------- user1 | credit| 15 --------------------------- user1 | bill | 100 --------------------------- user1 | fraud | 10000 ---------------------------- user3 | fr
user_id | type | amount
---------------------------
user1 | credit| 15
---------------------------
user1 | bill | 100
---------------------------
user1 | fraud | 10000
----------------------------
user3 | fraud | 1000000
我的目标是每行有一个用户id:
user_id | credit | bill | fraud |
----------------------------------------
user1 | 15 | 100 | 10000
----------------------------------------
user3 | 0 | 0 | 1000000
我可以用CASE创建静态语句,但是我希望动态创建这个部分,因为在某些情况下,我有太多的类别
CASE WHEN type='credit' THEN amount ELSE 0 END AS credit,
CASE WHEN type='fraud' THEN amount ELSE 0 END AS fraud,
CASE WHEN type='bill' THEN amount ELSE 0 END AS bill
and max() and group by in following select().
如果您熟悉R语言,我正在寻找model.matrix()等效项
编辑
我正在寻找SQL/Redshift中的解决方案。我知道如何在R中执行此操作,但是R中处理的信息量太大。正如我在问题中提到的,有一种简单的方法可以在SQL中展开列并创建虚拟变量,但是每个列都必须手动编码:
SELECT user_id,
CASE WHEN type='credit' THEN amount ELSE 0 END AS credit,
CASE WHEN type='fraud' THEN amount ELSE 0 END AS fraud,
CASE WHEN type='bill' THEN amount ELSE 0 END AS bill
FROM table1
GROUP BY user_id
我确信在Redshift中无法构造动态SQL,所以我在R中构建了整个查询,然后将其传递给Redshift:
1. Get all possible values from Type column:
SELECT disctinct(type) from table1;
2. Create a dynamic query in R and execute it in Redshift.
您尝试过在R中使用从长到宽的格式吗?我不能使用R,因为我处理的数量太多了。我想在数据库中准备数据集,然后卸载其中的一部分。检查交叉表功能不幸的是,我在红移,但感谢链接。我现在很困惑。您需要R语言的解决方案还是SQL(或类似的DB语言)的解决方案?在R中,重塑范式将最有效。使用软件包整形2中的整形功能或dcast功能(更直观)。您还可以使用model.matrix替代方案。如果这是你想看到的方向,我可以告诉你怎么做。