本文將為您介紹明細圈人函數bit_construct和bit_match的具體使用語法。
背景信息
在圈人場景中,通常會有通過明細表圈人的需求,例如一個用戶有多條記錄,不同的記錄滿足不同的條件,明細圈人通常需要找出滿足某些條件組合的用戶列表。
示例明細表如下,需要在明細表中找出有過click購物車
和view收藏頁
行為的user列表(此處滿足條件的是user A)。
user | action | page |
A | click | 購物車 |
B | click | 首頁 |
A | view | 收藏頁 |
B | click | 購物車 |
A | click | 收藏頁 |
傳統的查詢方法是采用多輪條件過濾并使用JOIN語句來篩選出符合條件的結果,這種方法需要寫復雜的SQL,同時多個JOIN語句也會消耗大量的資源。從Hologres V0.10版本開始,針對明細表圈人場景提供bit_construct和bit_match函數,只需要通過一輪過濾篩選和函數計算即可得到結果人群數據,降低明細圈人場景開發復雜度,快速得到結果。
使用限制
在Hologres中使用明細圈人函數,具體限制如下:
該函數僅Hologres V0.10及以上版本支持,請在Hologres管控臺查看當前實例版本,如果您的實例是V0.10以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
明細圈人函數在使用之前,需要執行以下語句開啟extension。extension是DB級別的函數,一個DB只需執行一次即可,新建DB需要重新執行。
--創建extension CREATE EXTENSION flow_analysis;
說明如需卸載extension請執行如下命令。
DROP EXTENSION flow_analysis;
bit_construct
Hologres在V0.10及以上版本提供了bit_construct函數用于明細表圈人場景。
函數說明
bit_construct通過設置篩選條件,返回一個最多32位integer類型的bitmap。
語法示例
bit_construct( a , b , ...., a6 )
參數說明
參數a和b等,代表篩選條件,為bool類型,最多支持32個條件,取值范圍為a~z,a1~a6。
函數返回值類型為int。
bit_match
Hologres在V0.10及以上版本提供了bit_match函數用于明細表圈人場景。
函數說明
bit_match用于對bit_construct篩選的結果進行進一步計算
語法示例
bit_match('expression', bitmask)
參數說明
參數
說明
示例
expression
bit_construct函數中的條件表達式,支持
&
(and)、|
(or)、!
(not)和^
(XOR )。a&b
bitmask
bit_construct構造的bitmap名。
無
使用示例
使用明細圈人函數,完整語法示例如下:
開啟extension。
Superuser在DB中執行如下語句開啟extension:
CREATE EXTENSION flow_analysis;
準備表和數據。
如下為一張記錄用戶購物行為的明細表,該表記錄了用戶的uid以及購物路徑的行為,同時對該表插入部分數據。
create table ods_app_dwd( event_time timestamptz, uid bigint, action text, page text, product_code text, from_days int ); insert into ods_app_dwd values('2021-04-03 10:01:30', 274649163, 'click', '購物車', 'MDS', 1); insert into ods_app_dwd values('2021-04-03 10:04:30', 274649163, 'view', '收藏頁', 'MDS', 4); insert into ods_app_dwd values('2021-04-03 10:06:30', 274649165, 'click', '購物車', 'MMS', 8); insert into ods_app_dwd values('2021-04-03 10:09:30', 274649165, 'view', '購物車', 'MDS', 10);
數據查詢。
查詢出滿足“某個時間范圍內將商品既加入購物車又添加至收藏頁”條件的精準用戶。
您可以使用如下兩種方式進行數據查詢:
使用WHERE語句查詢。
說明在查詢語句中WHERE條件篩選后的數據越少,查詢性能越好。
WITH tbl as ( SELECT uid, bit_or(bit_construct( a := (action='click' and page='購物車'), b := (action='view' and page='收藏頁'))) as uid_mask FROM ods_app_dwd WHERE event_time > '2021-04-03 10:00:00' AND event_time < '2021-04-04 10:00:00' GROUP BY uid ) SELECT uid from tbl where bit_match('a&b', uid_mask);
其中關于SQL語句的釋義如下:
bit_construct:篩選出加入購物車的用戶為條件a,篩選出添加至收藏夾的用戶為條件b。
bit_or:將篩選出的條件a和b取或,在該SQL語句示例中,同一個用戶只要有一行符合條件,即認為符合條件。
bit_match:a&b取滿足條件a和b的交集。
使用HAVING子句調用查詢。
SELECT uid FROM ( SELECT uid, bit_or(bit_construct( a := (action='click' AND page='購物車'), b := (action='view' AND page='收藏頁'))) as uid_mask FROM ods_app_dwd WHERE event_time > '2021-04-03 10:00:00' AND event_time < '2021-04-04 10:00:00' GROUP BY uid HAVING bit_match('a&b', bit_or(bit_construct( a := (action='click' and page='購物車'), b := (action='view' and page='收藏頁')))) ) t