3

标题很糟糕,但这是我能做的最好的。我所拥有的是这样的:

Country  Tag    Weight
-----------------------
1        1      20
1        2      30
1        3      77
2        1      10
2        2      11
2        3      100

或者,以人类可读的形式:

Country  Tag    Weight
-----------------------
USA      Rock   20
USA      Pop    30
USA      Metal  77
Spain    Rock   10
Spain    Pop    11
Spain    Metal  100

在 Knime 中使用 SQL(创建视图)或数据操作工具,我需要将数据操作成这种形式:

Country  Rock   Pop   Metal
----------------------------
USA      20     30    77
Spain    10     11    100

本质上,标签条目(唯一的)成为列,国家(唯一的)成为行 ID,权重值与他们的国家/标签一致。

我已经尝试了我在 Knime 中能想到的一切,并且没有想到任何原始 SQL 查询。在 Knime 中,我成功创建了我想要的矩阵结构(Country x Tag),但我不知道如何填充实际的 Weight 值,它们都是问号。我的工作解决方案是简单地将数据以我想要的形式输出到 CSV 文件中,而不是输出到数据库中。但是保持同步很笨拙和烦人。有任何想法吗?

4

3 回答 3

3

您正在寻找pivotcross table。我不太喜欢 Knime,但这就是你想在谷歌上搜索的技术。如果 Knime 没有该功能,您可以做的比将该 CSV 数据放入 MS Excel 并对其进行旋转更糟糕。

于 2010-11-03T03:07:07.797 回答
2

使用 ANSI SQL,您将使用:

  SELECT t.country,
         MAX(CASE WHEN t.tag = 'Rock' THEN t.weight END) AS Rock,
         MAX(CASE WHEN t.tag = 'Pop' THEN t.weight END) AS Pop,
         MAX(CASE WHEN t.tag = 'Metal' THEN t.weight END) AS Metal
    FROM YOUR_TABLE t
GROUP BY t.country

LesterDove 是正确的 - 您在进行数据透视查询,将行数据转换为列数据。

PIVOT(和 UNPIVOT)是 ANSI 语法,但支持有点滞后——我知道的只有 SQL Server 2005+、Oracle 11g+。这是下一个最受 ANSI/广泛支持的方法。

于 2010-11-03T03:14:01.547 回答
2

您可以使用 KNIME 中的 Pivoting 节点来执行此技巧。只需选择 Tag 列作为 Pivot 列,Country 列作为 Group 列,在 Aggregation 部分选择 Weight 列和聚合方法 sum。再见,托拜厄斯

于 2010-11-04T07:29:28.663 回答