【发布时间】:2016-05-24 22:20:54
【问题描述】:
假设我有一个这样的数据集。
ID Item
1 A
2 B
3 A
1 C
2 B
2 B
1 A
3 B
实际数据集有 50K 行和 8.5K 个不同的 Item 值。
现在我想将每个 Id 的行转换为列,以便我们计算每个用户的每个项目的值。如下所示
ID A B C
1 2 0 1
2 0 3 0
3 1 1 0
现在如果我喜欢设置没有。项目值然后我可以硬编码它们以防聚合语句。
有点像
select ID, count(case when Item ='A' then 1 else Null end) A,
count(case when Item='B' then 1 else Null end) B... and so on.
但在这种情况下,我有 8.5K 唯一项。这将是太多的任务,如上面的 sql 中所做的那样。
我怎样才能做到这一点是 Sql 和 ii) Python。请记住,我有 50K 行和 8.5k 个唯一项,因此 python 循环可能会有点慢。
但我的第一个目标是在 sql 中执行此操作,因为这是 50K 的样本数据。当数据变大时,sql 仍然可以很好地保持它,但是我觉得 python 会变慢。在 python 中我也可以尝试一些代码。但是当数据超过 50K obs 时,python 也会变得很慢
请指教
不使用 Postgresql 并使用 HANA,因此特定于 Postgres 的功能可能不起作用。请建议通用的sql方式。
【问题讨论】:
-
您正在寻找的是 MySQL 不支持的“Cross Tab”查询。它必须是代码(或存储过程),或类似于您建议的查询。但是该查询应该使用
SUM,或者COUNT 中的ELSE 应该是ELSE NULL; COUNT 计数为 0。 -
是的。但我不能使用我提议的那个。我在 Item 中有 8.5K 唯一值。不能硬编码 8.5K 次。那么它的8k行代码。我使用的是 HANA 而不是 Mysql。我正在寻找任何特定函数(如 Pivot 或 Crosstab)之外的通用 sql 查询,因为 PIVOT 和 CROSSTAB 不会在 HANA 中出现
-
您是否需要以特定形式在某处(导出)显示该信息,或者您需要访问应用中的计数来计算某些内容?
-
基本上我正在处理如上图 1 所示的数据集。我需要将其转换为 2,以便我可以使用 2 来进行我正在做的一些进一步的分析。数据必须采用 2 格式才能进行分析。所以这就是为什么我需要创建一个新的数据集来从 1 转换为 2。