模型濾波器語法與範例(Analysis Services - 資料探勘)

適用於: SQL Server 2019 和更早版本的 Analysis Services Azure Analysis Services Fabric/Power BI Premium

重要

SQL Server 2017 Analysis Services 中已淘汰數據採礦,現在已在 SQL Server 2022 Analysis Services 中停止。 文件不會針對已棄用和已停止支援的功能進行更新。 若要深入瞭解,請參閱 Analysis Services 回溯相容性。

本文說明模型濾波器語法並提供範例表達式。

濾波器語法

案件屬性的篩選器

巢狀資料表屬性的篩選器

多巢狀資料表屬性的過濾器

篩選巢狀表格中缺少的屬性

多個巢狀資料表值的過濾器

巢狀資料表屬性與 EXISTS 的過濾器

濾波器組合

日期篩選器

篩選語法

篩選運算式通常等同於 WHERE 子句中的運算式。 將多個條件與邏輯運算子 AND、 OR、 NOT結合。

在巢狀資料表中,使用 EXISTS 與 NOT EXISTS 運算元。 如果子查詢至少回傳一列,EXISTS 條件的值為 true。 利用此條件限制模型僅包含巢狀資料表中特定值的案例,例如至少購買過一次商品的客戶。

若子查詢未傳回任何資料列,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> ]  

篩選
包含一或多個述詞,由邏輯運算符連接。

謂詞列表
一或多個有效的篩選表示式,以邏輯運算子分隔。

欄位名稱
採礦結構欄位的名稱。

邏輯運算子
與,或,非

avPredicate
只能套用至純量採礦結構數據行的篩選表達式。 avPredicate 表達式可用於兩種模型過濾器或巢狀表格過濾器。

使用下列任一運算符的表達式只能套用至連續數據行。 :

  • < (小於)

  • > (大於)

  • >= (大於或等於)

  • <= (小於或等於)

注意

無論資料型態為何,都不要將這些運算子套用到類型 Discrete為 、 Discretized或 Key的欄位。

使用下列任一運算符的表達式可以套用至連續、離散、離散化或索引鍵數據行:

  • = (相等)

  • != (不等於)

  • 是空

當 avPredicate 套用於離散化欄位時,請在篩選器中使用目標值區中的任何值。

不要將條件定義為 AgeDisc = '25-35'。 請改用該區間內的值。

例如,表示 AgeDisc = 27 與 27 相同區間內的任何值,在此例中為 25–35。

nestedTable述詞
套用至巢狀數據表的篩選表達式。 只能在模型篩選中使用。

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:使用巢狀資料表屬性的案例層級過濾

如果您的採礦結構包含巢狀數據表,您可以篩選巢狀數據表中是否有值,或篩選包含特定值的巢狀數據表數據列。 本範例會將模型使用的案例限制為年齡超過 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中的第一個條件 ,適用於案例表中的一欄。 其餘條件會套用至巢狀數據表。

第二個條件 EXISTS (SELECT * FROM Products WHERE ProductName='Milk'),檢查巢狀表中是否至少包含一項包含牛奶的購買。 第三個條件 Quantity >= 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),表示 OnSale 的值必須是 trueProductName 中列出的產品。 在此情況下, OnSale 是一個結構欄位。

篩選器的第二部分,針對 ProductsNotOnSale,使用相同的語法,但會篩選 OnSale 屬於 false (!OnSale) 的產品。

最後,你將條件合併,並在案例表中加入一個限制。 結果是根據 ProductsOnSale 清單中包含的案例,預測所有 25 歲以上顧客在 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 資料類型不支援的特定粒度層級,請在資料來源中使用表達式建立衍生值,以擷取要用於篩選和分析的單位。

警告

當你指定日期作為篩選條件時,無論目前作業系統的日期格式如何,都應該使用該 mm/dd/yyyy 格式。 任何其他格式都會產生錯誤。

例如,如果您想要篩選您的來電中心結果只顯示週末,您可以在數據源檢視中建立表達式,以擷取每個日期的工作日名稱,然後將該工作日名稱值用於輸入,或做為篩選中的離散值。 請記得重複的數值會影響模型,因此請只使用其中一欄,不要同時使用日期欄加上導出值。

另請參閱

挖礦模型篩選器(分析服務 - 資料探勘)
測試和驗證(資料探勘)