Share via


StructureColumn (DMX)

指定したケースに対応する構造列の値、または指定したケースの入れ子になったテーブルのテーブル値を返します。

構文

StructureColumn('structure column name')

引数

  • structure-column-name。
    ケースまたは入れ子になったテーブルのマイニング構造列の名前。

結果のデータ型

返される型は、<structure column name> パラメータで参照される列の型によって異なります。例えば、参照されるマイニング構造列がスカラ値を含む場合、関数はスカラ値を返します。

参照されるマイニング構造列が入れ子になったテーブルである場合、関数はテーブル値を返します。返されたテーブル値は、サブ SELECT ステートメントの FROM 句に使用できます。

説明

この関数はポリモーフィックで、SELECT 式リスト、WHERE 条件式、ORDER BY 式など、式を使用できるステートメント内の任意の場所で使用できます。

マイニング構造列の名前は文字列値なので、単一引用符で囲む必要があります。たとえば、StructureColumn('column 1') のようにします。同じ名前を持つ列が複数ある場合、名前は SELECT ステートメントが含まれるコンテキスト内で解決されます。

StructureColumn 関数を使用するクエリから返される結果は、モデル上にフィルタがあると影響を受けます。つまり、モデル フィルタは、マイニング モデルに含まれるケースを制御します。したがって、構造列上のクエリは、マイニング モデルに使用されたケースのみを返します。ケース テーブルと入れ子になったテーブルの両方に対するマイニング モデル フィルタの影響を示すコード例については、このトピックの「例」のセクションを参照してください。

DMX SELECT ステートメントでこの関数を使用する方法の詳細については、「SELECT FROM <model>.CASES (DMX)」または「SELECT FROM <structure>.CASES」を参照してください。

エラー メッセージ

次のセキュリティ エラーは、親のマイニング構造に対するドリルスルー権限がユーザーに与えられていない場合に発生します。

'%{user/}' ユーザーには、'%{model/}' マイニング モデルの親マイニング構造にドリルスルーする権限がありません。

次のエラー メッセージは、無効な構造列名が指定された場合に表示されます。

'%{structure-column-name/}' マイニング構造列が '%{structure/}' 親マイニング構造内に見つかりませんでした (現在のコンテキスト (line %{line/}、列 %{column/}))。

ここに示す例では、次のマイニング構造を使用します。マイニング構造には、2 つの入れ子になったテーブル列 Products および Hobbies が含まれます。Hobbies 列の入れ子になったテーブルには、入れ子になったテーブルのキーとして使用される単一列があります。Products 列の入れ子になったテーブルは、入力に使用されるキー列およびその他の列の両方を持つ、複雑な入れ子になったテーブルです。次の例は、モデルですべての列を使用しない可能性があっても、多くの異なる列を組み込んでデータ マイニング構造を設計する方法を示しています。これらの列の一部は、モデル レベルでパターンの汎用化に役立たない可能性がありますが、ドリルスルーには非常に有効です。

CREATE MINING STRUCTURE [MyStructure] 
(
CustomerName TEXT KEY,
Occupation TEXT DISCRETE,
Age LONG CONTINUOUS,
MaritalStatus TEXT DISCRETE,
Income LONG CONTINUOUS,
Products  TABLE
 (
    ProductNameTEXT KEY,
    Quantity LONG CONTINUOUS,
    OnSale BOOLEAN  DISCRETE
)
 Hobbies  TABLE
 (
    Hobby KEY
 ))

次に、以下のコード例で、作成した構造に基づいてマイニング モデルを作成します。

ALTER MINING STRUCTURE [MyStructure] ADD MINING MODEL [MyModel] (
CustomerName,
Age,
MaritalStatus,
Income PREDICT,
Products 
(
ProductName
) WITH FILTER(NOT OnSale)
) USING Microsoft_Decision_Trees 
WITH FILTER(EXISTS (Products))

サンプル クエリ 1: マイニング構造から列を返す

次のサンプル クエリでは、マイニング モデルの一部として定義されている列 CustomerName および Age が返されます。ただし、このクエリでは、構造の一部であってもマイニング モデルの一部ではない Age 列も返されます。

SELECT CustomerName, Age, StructureColumn(‘Occupation’) FROM MyModel.CASES 
WHERE Age > 30

年齢が 30 歳を超える顧客にケースを制限する行のフィルタ処理は、モデルのレベルで実行されます。したがって、この式は、構造データに含まれているが、モデルから使用されないケースを返しません。モデル (EXISTS (Products)) の作成に使用するフィルタ条件は、製品を購入した顧客のみにケースを制限するため、このクエリによって返されないケースが構造内にある可能性もあります。

サンプル クエリ 2: 構造列にフィルタを適用する

次のサンプル クエリは、モデル列 CustomerName および Age、および入れ子になったテーブル Products を返すだけでなく、モデルの一部ではない、入れ子になったテーブル内の列 Quantity の値も返します。

SELECT CustomerName, Age,
(SELECT ProductName, StructureColumn(‘Quantity’) FROM Products) FROM MA.CASES 
WHERE StructureColumn(‘Occupation’) = ‘Architect’

この例では、職業が Architect (WHERE StructureColumn(‘Occupation’) = ‘Architect’) の顧客にケースを制限するフィルタを構造列に適用します。モデル フィルタ条件はモデルの作成時に必ずケースに適用されるため、Products テーブル内に条件を満たす行が少なくとも 1 つあるケースのみが、モデル ケースに入れられます。したがって、入れ子になったテーブル Products のフィルタとケース (‘Occupation’) のフィルタの両方が適用されます。

サンプル クエリ 3: 入れ子になったテーブルから列を選択する

次のサンプル クエリでは、トレーニング ケースとして使用された顧客の名前がモデルから返されます。顧客ごとに、購入の詳細を含む入れ子になったテーブルも返されます。モデルには ProductName 列が含まれますが、モデルは ProductName 列の値を使用しません。モデルは、製品が通常の価格 (NOTOnSale) で購入されたかどうかだけチェックします。このクエリでは、製品名だけでなく、モデルには含まれていない購入した数量も返されます。

SELECT CustomerName,  
(SELECT ProductName, StructureColumn('Quantity')FROM Products) 
FROM MyModel.CASES

マイニング モデルでドリルスルーが有効でない限り、ProductName 列または Quantity 列を返すことはできません。

サンプル クエリ 4: フィルタを適用して入れ子になったテーブル列を返す

次のサンプル クエリは、マイニング構造に含まれるがモデルに含まれない、ケースおよび入れ子になったテーブル列を返します。モデルは既に OnSale 製品が存在するかどうかでフィルタ処理されていますが、このクエリはマイニング構造列 Quantity にフィルタを追加します。

SELECT CustomerName, Age, StructureColumn('Occupation'), 
(SELECT ProductName, StructureColumn('Quantity') FROM Products) 
FROM MyModel.CASES 
WHERE EXISTS (SELECT * FROM Products WHERE StructureColumn('Quantity')>1)