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

SQL (ビューを作成するため) または Knime のデータ操作ツールを使用して、データを次の形式に操作する必要があります。

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

基本的に、タグ エントリ (一意のもの) は列になり、国 (一意のもの) は国/タグに固執する重み値を持つ行 ID になります。

私は Knime で考えられるすべてを試しましたが、生の SQL クエリは思い浮かびません。Knime では、必要なマトリックス (国 x タグ) の構造を正常に作成しましたが、実際の重み値を入力する方法がわかりません。それらはすべて疑問符です。私の実用的な解決策は、データベースではなく、必要な形式でデータを CSV ファイルに単純に出力することです。しかし、同期を維持するのは面倒で面倒です。何か案は?

4

3 に答える 3

3

pivotまたはを探していますcross table。私はKnimeにはあまり興味がありませんが、それはあなたがググりたいテクニックです. Knime にその機能がない場合は、その CSV データを MS Excel にドロップしてピボットするよりも悪いことをする可能性があります。

于 2010-11-03T03:07:07.797 に答える
2

KNIME の Pivoting ノードを使用して、トリックを実行できます。Tag 列を Pivot 列として、Country 列を Group 列として、Aggregation セクションで Weight 列を、集計方法 sum として選択するだけです。さようなら、トバイアス

于 2010-11-04T07:29:28.663 に答える
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 に答える