StructureColumn (DMX)
適用対象:SQL Server Analysis Services
指定したケースに対応する構造体列の値、または指定したケースの入れ子になったテーブルのテーブル値を返します。
構文
StructureColumn('structure column name')
引数
structure-column-name。
ケースまたは入れ子になったテーブルのマイニング構造列の名前。
結果の種類
返される型は、 <structure 列名> パラメーターで参照される列の型によって異なります。 たとえば、参照されるマイニング構造列がスカラー値を含む場合、関数はスカラー値を返します。
参照されるマイニング構造列が入れ子になったテーブルの場合、関数はテーブル値を返します。 返されるテーブル値は、サブ SELECT ステートメントの FROM 句で使用できます。
解説
この関数はポリモーフィックであり、SELECT 式リスト、WHERE 条件式、ORDER BY 式など、式を許可するステートメント内の任意の場所で使用できます。
マイニング構造の列の名前は文字列値であるため、単一引用符で囲む必要があります(例: StructureColumn('
列 1')
。 同じ名前を持つ列が複数ある場合、名前は SELECT ステートメントが含まれるコンテキスト内で解決されます。
StructureColumn 関数を使用してクエリから返される結果は、モデルにフィルターが存在する場合に影響を受けます。 つまり、モデル フィルターは、マイニング モデルに含まれるケースを制御します。 そのため、構造列に対するクエリは、マイニング モデルで使用されたケースのみを返すことができます。 ケース テーブルと入れ子になったテーブルの両方に対するマイニング モデル フィルターの効果を示すコード サンプルについては、このトピックの「例」セクションを参照してください。
DMX SELECT ステートメントでこの関数を使用する方法の詳細については、「
エラー メッセージ
ユーザーが親マイニング構造に対するドリルスルー アクセス許可を持っていない場合は、次のセキュリティ エラーが発生します。
'%{user/}' ユーザーには、'%{model/}' マイニング モデルの親マイニング構造にドリルスルーする権限がありません。
次のエラー メッセージは、無効な構造列名が指定された場合に表示されます。
'%{structure-column-name/}' マイニング構造列が、現在のコンテキスト (行 %{line/}、列 %{column/}) の '%{structure/}' 親マイニング構造で見つかりませんでした。
例
これらの例では、次のマイニング構造を使用します。 マイニング構造には、 Products
と Hobbies
の 2 つの入れ子になったテーブル列が含まれていることに注意してください。 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'
この例では、構造列にフィルターを適用して、職業が "アーキテクト" (WHERE StructureColumn('Occupation') = 'Architect'
) の顧客にケースを制限します。 モデル フィルター条件は、モデルの作成時に常にケースに適用されるため、モデル ケースには、 Products
テーブルに少なくとも 1 つの修飾行が含まれるケースのみが含まれます。 したがって、入れ子になったテーブルのフィルター Products
とケースのフィルターの両方 ('Occupation')
適用されます。
サンプル クエリ 3: 入れ子になったテーブルから列を選択する
次のサンプル クエリでは、トレーニング ケースとして使用された顧客の名前がモデルから返されます。 顧客ごとに、クエリは購入の詳細を含む入れ子になったテーブルも返します。 モデルには ProductName
列が含まれていますが、モデルでは ProductName
列の値は使用されません。 このモデルでは、製品が通常の (NOT``OnSale
) 価格で購入されたかどうかのみが確認されます。 このクエリは製品名を返すだけでなく、購入した数量も返しますが、モデルには含まれません。
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)