在PowerQuery中讓用戶自定義篩選條件的一種解決辦法

【緣起】
最近遇到一個問題:把數(shù)據(jù)導(dǎo)入PowerBI進(jìn)行清洗時,需要對某列的文本按照一定條件進(jìn)行篩選,而這個篩選條件必須由使用模板的人來確定,而不是我來確定;或者說,篩選條件必須臨時快速確定下來。這樣一來,我無法事先在PowerQuery中確定篩選條件究竟有哪些。

【解決思路】
研究PowerQuery中多條件篩選的語句,發(fā)現(xiàn)是用關(guān)鍵字“and”或“or”來連接的,從集合觀點來看,“and”就是取多個集合的交集,“or”就是取多個集合的并集。因此,如果我們得到每個篩選詞的結(jié)果(單個集合),理論上就可以得出它們的交集或并集。

由于篩選詞目前無法確定,所以它是一個動態(tài)的未知數(shù),它獲取的結(jié)果也是動態(tài)的,這正好符合函數(shù)特征。因此,我們將每一次篩選過程抽象為一個函數(shù)fnFilter()。

構(gòu)造這個fnFilter()函數(shù)很簡單:在常規(guī)查詢中,任意選定一個符合業(yè)務(wù)目標(biāo)的篩選詞,篩選出結(jié)果,對結(jié)果進(jìn)行相應(yīng)處理,最后將其轉(zhuǎn)化為函數(shù),把篩選詞用filter代替,以作為fnFilter()的參數(shù)。

接下來,我們需要找到一個能夠隨時輸入或更改多個篩選詞的辦法。在Power BI Desktop中,提供了一個“輸入數(shù)據(jù)”的功能,可以在一個表格中手動輸入(或粘貼)臨時數(shù)據(jù),因此我們用這個功能來構(gòu)造篩選條件。只保留一列,列名為“篩選條件”。

隨意輸入幾行文本作為篩選條件,然后新增一列:

  = Table.AddColumn(Source, "Custom", each fnFilter([篩選條件]))

注意“Source”是指我們上一步手動輸入的篩選條件。這樣為每一個篩選條件生成了一個篩選結(jié)果。

到這一步,成功了一大半,但是前路依然艱難,因為根據(jù)我們想要的結(jié)果——交集還是并集——的不同,處理方法和難度完全不一樣。

如果我們需要用“and”來獲取篩選結(jié)果的交集,則需要將篩選結(jié)果進(jìn)行innerjoin的操作,需要兩兩進(jìn)行,這意味著有n個篩選條件,就要執(zhí)行n-1次innerjoin的操作,太復(fù)雜,還不如放棄,直接在PowerQuery的界面進(jìn)行篩選操作。

如果我們需要用“or”來獲取篩選結(jié)果的并集,就很簡單了。由于fnFilter()函數(shù)產(chǎn)生的新列,每一行都是一個表格,所以可以直接點擊列名旁邊的展開符號,將表格展開,這樣就將所有篩選結(jié)果合并起來了。為了保險起見,最后全選表格,剔除重復(fù)值,完畢。

接下來要做的是,教會使用者如何對手動輸入數(shù)據(jù)的表格里的篩選條件進(jìn)行增刪改操作:在手動輸入數(shù)據(jù)后生成的查詢的第一步,點擊旁邊的齒輪符號,就會彈出用于輸入數(shù)據(jù)的表格,可以對其中的篩選條件進(jìn)行增刪改操作。

修改完操作條件后,記得保存,然后刷新。完畢。

【延伸】
從理想角度而言,終端用戶要篩選數(shù)據(jù),完全可以在PowerBI報告中自己篩選,不用在數(shù)據(jù)清洗階段就介入。但是目前PowerBI報告層面要對某個字段進(jìn)行多條件篩選,受到很大局限——無論是并集還是交集,都只能添加兩個篩選條件,當(dāng)同一個字段所需的篩選條件多余兩個時,就沒轍了,還是只能回到PowerQuery中去。

另,如果用Excel來處理這個問題,就更簡單了:利用鏈接表格來控制篩選條件,然后刷新即可。絕大多數(shù)人對Excel的熟悉程度遠(yuǎn)超PowerBI Desktop。由于思路和基本操作都一樣,不贅述。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容