適用対象:
SQL Server 2019 以前の Analysis Services
Azure Analysis Services
Fabric/Power BI Premium
Important
データ マイニングは SQL Server 2017 Analysis Services で非推奨となり、現在は SQL Server 2022 Analysis Services で廃止されました。 非推奨および廃止された機能については、ドキュメントは更新されません。 詳細については、「 Analysis Services の下位互換性」を参照してください。
この記事では、モデル フィルターの構文について説明し、サンプル式を提供します。
入れ子になったテーブル属性と EXISTS に対するフィルター
フィルター構文
フィルター式は、通常、 WHERE 句の式と同じです。 複数の条件を論理演算子 AND、 OR、および NOTと組み合わせます。
入れ子になったテーブルでは、 EXISTS 演算子と NOT EXISTS 演算子を使用します。 サブクエリから少なくとも 1 つの行が返された場合、 EXISTS 条件は true と評価されます。 この条件を使用して、少なくとも 1 回アイテムを購入した顧客など、入れ子になったテーブル内の特定の値を含むケースにモデルを制限します。
サブクエリが行を返さない場合、 NOT EXISTS 条件は true に評価されます。 この条件を使用して、特定のアイテムを購入したことがない顧客にモデルを制限します。
一般的な構文は次のとおりです。
<filter>::=<predicate list> | ( <predicate list> )
<predicate list>::= <predicate> | [<logical_operator> <predicate list>]
<logical_operator::= AND| OR
<predicate>::= NOT <predicate>|( <predicate> ) <avPredicate> | <nestedTablePredicate> | ( <predicate> )
<avPredicate>::= <columnName> <operator> <scalar> | <columnName> IS [NOT] NULL
<operator>::= = | != | <> | > | >= | < | <=
<nestedTablePredicate>::= EXISTS (<subquery>)
<subquery>::=SELECT * FROM <columnName>[ WHERE <predicate list> ]
フィルター
論理演算子によって接続された 1 つ以上の述語が含まれています。
述語リスト
論理演算子で区切られた 1 つ以上の有効なフィルター式。
Columnname
マイニング構造列の名前。
論理演算子
AND、 OR、 NOT
avPredicate
スカラー マイニング構造列にのみ適用できるフィルター式。
avPredicate 式は、モデル フィルターまたは入れ子になったテーブル フィルターの両方で使用できます。
次のいずれかの演算子を使用する式は、連続列にのみ適用できます。 :
< (より小さい)
> (より大きい)
>= (以上)
<= (以下)
注
データ型に関係なく、 Discrete、 Discretized、または Key型の列には、これらの演算子を適用しないでください。
次のいずれかの演算子を使用する式は、連続、不連続、分離、またはキー列に適用できます。
= (等しい)
!= (等しくない)
IS NULL
avPredicateが分離された列に適用される場合は、フィルター内のターゲット バケットの任意の値を使用します。
条件を AgeDisc = '25-35'として定義しないでください。 代わりに、その間隔の値を使用します。
たとえば、 AgeDisc = 27 は 27 と同じ間隔 (この例では 25 ~ 35) の任意の値を表します。
nestedTablePredicate
入れ子になったテーブルに適用されるフィルター式。 モデル フィルターでのみ使用できます。
nestedTablePredicateは、テーブル マイニング構造列に対してのみサブクエリを受け入れます。
サブクエリ
SELECT ステートメントの後に有効な述語または述語の一覧が続きます。
avPredicate述語のみを使用します。 各述語は、 columnNameによって識別される現在の入れ子になったテーブル内の列のみを参照できます。
フィルター構文に関する制限事項
フィルターには次の制限が適用されます。
フィルターでは、数学演算子、スカラー、列名など、単純な述語のみを使用します。
フィルター構文では、ユーザー定義関数はサポートされていません。
フィルター構文では、正符号や負符号など、ブール以外の演算子はサポートされていません。
フィルターの例
次の例は、マイニング モデルにフィルターを適用する方法を示しています。 SQL Server Data Toolsを使用してフィルター式を作成した場合、フィルター ダイアログ ボックスの [プロパティ] ウィンドウと [式] ウィンドウには、WITH FILTERキーワードの後に文字列のみが表示されます。 各例には、列の種類と使用法を明確にするマイニング構造の定義が含まれています。
例 1: 一般的なケース レベルのフィルター処理
この例では、モデルで使用されるケースを、職業がアーキテクトであり、年齢が 30 歳を超える顧客に制限する単純なフィルターを示しています。
ALTER MINING STRUCTURE MyStructure ADD MINING MODEL MyModel_1
(
CustomerId,
Age,
Occupation,
MaritalStatus PREDICT
)
WITH FILTER (Age > 30 AND Occupation='Architect')
例 2: 入れ子になったテーブル属性を使用したケース レベルのフィルター処理
マイニング構造に入れ子になったテーブルが含まれている場合は、入れ子になったテーブル内の値の存在をフィルター処理するか、特定の値を含む入れ子になったテーブル行をフィルター処理できます。 この例では、牛乳を含む購入を少なくとも 1 回行った 30 歳以上のお客様に、モデルに使用されるケースを制限します。
フィルターでは、モデルに含まれていない列を使用できます。 入れ子になったテーブル Products はマイニング構造の一部ですが、マイニング モデルには含まれません。 入れ子になったテーブルの値と属性をフィルター処理することもできます。 ドリルスルーを有効にして、ケースの詳細を表示します。
ALTER MINING STRUCTURE MyStructure ADD MINING MODEL MyModel_2
(
CustomerId,
Age,
Occupation,
MaritalStatus PREDICT
)
WITH DRILLTHROUGH,
FILTER (Age > 30 AND EXISTS (SELECT * FROM Products WHERE ProductName='Milk')
)
例 3: 複数の入れ子になったテーブル属性に対するケース レベルのフィルター処理
この例では、ケース テーブルに条件が適用され、入れ子になったテーブル内の属性に別の条件が適用され、入れ子になったテーブル列の特定の値に対して別の条件が適用されます。
フィルターの最初の条件 ( Age > 30) は、ケース テーブルの列に適用されます。 残りの条件は、入れ子になったテーブルに適用されます。
2番目の条件である EXISTS (SELECT * FROM Products WHERE ProductName='Milk') は、ネストされたテーブルに牛乳を含む購入データが少なくとも1件含まれているかどうかを確認します。 3 番目の条件 Quantity >= 2、顧客は 1 つのトランザクションで少なくとも 2 つの単位の牛乳を購入する必要があります。
ALTER MINING STRUCTURE MyStructure ADD MINING MODEL MyModel_3
(
CustomerId,
Age,
Occupation,
MaritalStatus PREDICT,
Products PREDICT
(
ProductName KEY,
Quantity
)
)
FILTER (Age > 30 AND EXISTS (SELECT * FROM Products WHERE ProductName='Milk' AND Quantity >= 2)
)
例 4: ネストされたテーブル属性が存在しない場合のケースレベルのフィルタリング
この例では、入れ子になったテーブルに属性がないかどうかをフィルター処理して、特定のアイテムを購入しなかった顧客にケースを制限します。 このモデルでは、牛乳を購入したことがない 30 歳以上の顧客を使用します。
ALTER MINING STRUCTURE MyStructure ADD MINING MODEL MyModel_4
(
CustomerId,
Age,
Occupation,
MaritalStatus PREDICT,
Products PREDICT
(
ProductName
)
)
FILTER (Age > 30 AND NOT EXISTS (SELECT * FROM Products WHERE ProductName='Milk') )
例 5: 複数の入れ子になったテーブル値に対するフィルター処理
この例では、入れ子になったテーブルのフィルター処理を示します。 入れ子になったテーブル フィルターは、ケース フィルターの後に実行され、入れ子になったテーブル行のみを制限します。
このモデルには、 EXISTS が指定されていないため、入れ子になったテーブルが空の複数のケースが含まれる可能性があります。
ALTER MINING STRUCTURE MyStructure ADD MINING MODEL MyModel_5
(
CustomerId,
Age,
Occupation,
MaritalStatus PREDICT,
Products PREDICT
(
ProductName KEY,
Quantity
) WITH FILTER(ProductName='Milk' OR ProductName='bottled water')
)
WITH DRILLTHROUGH
例 6: 入れ子になったテーブル属性と EXISTS でのフィルター処理
この例では、入れ子になったテーブル フィルターによって、牛乳またはボトル入り飲料水を含むものに行が制限されます。 その後、 EXISTS ステートメントによって、入れ子になったテーブルが存在しないケースにモデルが制限されます。
ALTER MINING STRUCTURE MyStructure ADD MINING MODEL MyModel_6
(
CustomerId,
Age,
Occupation,
MaritalStatus PREDICT,
Products PREDICT
(
ProductName KEY,
Quantity
) WITH FILTER(ProductName='Milk' OR ProductName='bottled water')
)
FILTER (EXISTS (Products))
例 7: 複雑なフィルターの組み合わせ
このシナリオは例 4 のシナリオに似ていますが、はるかに複雑です。 入れ子になったテーブル ProductsOnSale にはフィルター条件(OnSale)があります。つまり、ProductName に記載されている製品に対して OnSale の値をtrueする必要があります。 この場合、 OnSale は構造体列です。
ProductsNotOnSale のフィルターの 2 番目の部分では、同じ構文を使用しますが、OnSale がfalseされている製品をフィルター処理します (!OnSale)。
最後に、条件を組み合わせて、ケース テーブルにもう 1 つの制限を追加します。 その結果、25 歳以上のすべての顧客について、 ProductsOnSale リストに含まれるケースに基づいて ProductsNotOnSale リスト内の製品の購入を予測します。
ALTER MINING STRUCTURE MyStructure ADD MINING MODEL MyModel_7
(
CustomerId,
Age,
Occupation,
MaritalStatus,
ProductsOnSale
(
ProductName KEY
) WITH FILTER(OnSale),
ProductsNotOnSale PREDICT ONLY
(
ProductName KEY
) WITH FILTER(!OnSale)
)
WITH DRILLTHROUGH,
FILTER (EXISTS (ProductsOnSale) AND EXISTS(ProductsNotOnSale) AND Age > 25)
例 8: 日付のフィルター処理
他のデータと同様に、日付に基づいて入力列をフィルター処理できます。 日付/時刻型の列に含まれる日付は連続値です。したがって、より大きい (>) や小さい (<) などの演算子を使用して日付範囲を指定できます。 データ ソースが連続データ型で日付を表すのではなく、不連続値またはテキスト値として表される場合、日付範囲でフィルター処理することはできませんが、個別の不連続値を指定する必要があります。
ただし、フィルターに使用される日付列がモデルのキー列でもある場合、時系列モデルの日付列にフィルターを作成することはできません。 この制限は、時系列モデルとシーケンス クラスタリング モデルでは、日付列が KeyTime 型または KeySequence 型として処理される可能性があるためです。
時系列モデルで連続する日付をフィルター処理する必要がある場合は、マイニング構造に列のコピーを作成し、新しい列でモデルをフィルター処理できます。
たとえば、次の式は、予測モデルに追加された 継続的 な日付列をフィルター処理します。
=[DateCopy] > '12:31:2003:00:00:00'
注
モデルに追加する余分な列は、結果に影響する可能性があります。 系列の計算で列を使用しない場合は、モデルではなくマイニング構造にのみ列を追加します。 列のモデル フラグを PredictOnly または Ignore に設定することもできます。 詳細については、「 モデリング フラグ (データ マイニング)」を参照してください。
他のモデルの種類の場合は、他の列と同様に、入力条件またはフィルター条件として日付を使用できます。 ただし、 Continuous データ型でサポートされていない特定のレベルの細分性を使用する必要がある場合は、式を使用してフィルター処理と分析に使用する単位を抽出することで、データ ソースに派生値を作成します。
Warnung
フィルター条件として日付を指定する場合は、現在のオペレーティング システムの日付形式に関係なく、 mm/dd/yyyy 形式を使用します。 その他の形式の場合、エラーが発生します。
たとえば、コール センターの結果をフィルター処理して週末のみを表示する場合は、データ ソース ビューで各日付の曜日名を抽出する式を作成し、その曜日名の値を入力に使用するか、フィルター処理で個別の値として使用できます。 繰り返し値がモデルに影響を与える可能性があるので、日付列と派生値ではなく、列の 1 つだけを使用してください。
こちらもご覧ください
マイニング モデルのフィルター (Analysis Services - データ マイニング)
テストと検証 (データ マイニング)