1. SQL 的結果要求

需嚴格返回 3 列數據,每列分別表示:神策id, 用戶id, 標籤值

範例:

/* 需修改語句中的 event 為自己的業務欄位 */

SELECT DISTINCT user_id AS id, distinct_id AS distinct_id, 1 AS value
FROM events
WHERE date BETWEEN '[baseTime]' AND '[baseTime]'
    AND event = 'login'

/* 其中 id 表示"神策id", distinct_id 表示"設備id"或者"登入id",value 表示"標籤值" */
SQL

2. SQL 語句語法說明

2.1. 使用動態時間

標籤的每次計算都存在一個計算的“基準時間”。

若您的數據範圍是動態變化的,例如:每天標籤更新時,都會使用相對時間是“昨日”的數據進行計算;這時就需要使用動態時間來表示數據的時間範圍。

範例:

/* 需修改語句中的 event 為自己的業務欄位 */

SELECT DISTINCT user_id AS id, distinct_id AS distinct_id, '1' AS value
FROM events
WHERE date BETWEEN '[baseTime]' AND '[baseTime]'
    AND event = 'login'

/* 假設當前日期為 2019-06-20,那麼標籤規則的基準時間為 2019-06-19,於是 [baseTime] 代表昨日 2019-06-19, */
/* 每次標籤數據更新時,都會使用相對時間是昨日的數據進行計算 */
CODE

注意:SQL 建立標籤時,暫時不支援使用當前日期作為 baseTime。

'[baseTime]' 實際上表示的為“昨日”

'[baseTime]' - INTERVAL '6' DAY 表示為“過去第 7 天”

2.2. 其他查詢語法

參考神策分析官網文件《自定義查詢》

SQL 建立標籤 與神策分析自定義查詢的描述能力相同

點擊查看

3. SQL 建立標籤範例

3.1. 建立「最近 7 天消費次數」 

/* 假設當前基準時間為 2019-06-19 */ 
/* 數值型別標籤 */

SELECT user_id AS id, MAX(distinct_id) AS distinct_id, COUNT(*) AS value
FROM events
WHERE date BETWEEN '[baseTime]' - INTERVAL '6' DAY AND '[baseTime]'
    AND event = 'BuyProduct'
GROUP BY 1

/* 其中 count() 表示用戶的消費次數,返回值是數值型別,需要建立為數值型別標籤 */
CODE

3.2. 建立「最近 7 天瀏覽偏好的商品類型(前 3)」

/* 假設當前基準時間為 2019-06-19 */
/* 集合型別標籤*/ 

SELECT id, MAX(distinct_id) AS distinct_id,
    GROUP_CONCAT(product_type, '\n') AS value
FROM (
    SELECT id, distinct_id, product_type, 
        RANK() OVER (PARTITION BY id ORDER BY cnt DESC) AS rank_num
    FROM (
        SELECT user_id AS id, product_type,
            MAX(distinct_id) AS distinct_id, COUNT(*) AS cnt
        FROM events
        WHERE date BETWEEN '[baseTime]' - INTERVAL '6' DAY AND '[baseTime]'
            AND event = 'productdetails'
        GROUP BY 1, 2
    ) a
) b
WHERE rank_num <= 3
GROUP BY 1

/* 其中 group_concat(product_type, '\n') 表示用戶前三的商品型別。 */
/* 返回值是 list 型別,需要建立為集合型別的標籤 */
SQL

3.3. 建立「用戶最近一次訪問距今時間(天)」

/* 假設當前基準時間為 2019-06-19 */
/* 數值型別標籤 */

SELECT id, distinct_id, DATEDIFF(now(), time) AS value
FROM (
    SELECT user_id AS id, MAX(distinct_id) AS distinct_id, MAX(time) AS time
    FROM events
    WHERE date BETWEEN '[baseTime]' - INTERVAL '6' DAY AND '[baseTime]'
        AND event = 'View'
    GROUP BY 1
) a

/* 其中 View 為用戶訪事件,datediff(now(), time) as value 表示事件發生的距今天數 */
SQL

3.4. 建立「最近7天最近一次支付事件發生的時間」

/* 時間型別標籤 */

SELECT user_id AS id, MAX(distinct_id) AS distinct_id, 
    UNIX_TIMESTAMP(MAX(time)) * 1000 AS value
FROM events
WHERE date BETWEEN '[baseTime]' - INTERVAL '6' DAY AND '[baseTime]'
    AND event = 'View'
GROUP BY 1
SQL

3.5. 建立「最近7天瀏覽最多的商品類型」

/* 字串型別標籤 */

SELECT id, distinct_id, platform
FROM (
    SELECT id, distinct_id, platform, 
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY cnt DESC) AS row_num
    FROM (
        SELECT user_id AS id, platform, MAX(distinct_id) AS distinct_id, COUNT(*) AS cnt
        FROM events
        WHERE date BETWEEN '[baseTime]' - INTERVAL '6' DAY AND '[baseTime]'
            AND event = 'match'
        GROUP BY 1, 2
    ) a
) b
WHERE row_num <= 1
SQL

3.6. 建立「昨日進行了登入的用戶」

/* bool 型別標籤 */

SELECT DISTINCT user_id AS id, distinct_id AS distinct_id, 1 AS value
FROM events
WHERE date BETWEEN '[baseTime]' - INTERVAL '6' DAY AND '[baseTime]'
    AND event = 'match'
SQL