Window-Functions
在SQL中獲取具有特定值的行之前的行
我有一個如下表,其中使用者操作與時間戳一起儲存。我的目標是辨識在特定操作(名為reference_action)之前發生的操作併計算這些操作的數量,以查看哪些操作發生在特定操作之前以及它們是如何分佈的。
我知道像 LAG() 這樣的視窗函式,我可以在其中獲取某一行之前的行,但不知道如何包含像
WHERE action_name = "reference_action"
.查詢引擎是 Presto,表是 Hive 表,但我最感興趣的是一般的 SQL 方法,因此這無關緊要。
結果應如下所示:
有兩行,其中“desired_action1”後面直接跟有“reference_action”的行,當按 排序時
timestamp
,因此計數為 2。同樣的邏輯適用於為什麼“desired_action2”的計數為 1。目標是了解使用者在購買之前做了什麼(購買 = reference_action)。要了解他之前做了什麼,我想查找購買之前發生的操作。因此,我需要在reference_action 之前知道行中的action_name。required_actions 必須被計算,reference_actions 只是我想要計算的操作之後的行,用於確定應該計算哪些值。
在任何支持的 SQL 變體中,執行此操作的步驟實際上都非常簡單
LAG
:
- 在派生表或 CTE 中提取先前的
action_name
using ,。LAG
- 在外部過濾到僅包含 的行
'reference_action'
,這些行也將具有第一步中的先前操作。您想在外面執行此操作,否則您將無法獲得正確的LAG
值。- 按上一個動作分組,併計數。
SELECT prevAction AS action, COUNT(*) AS [count] FROM ( SELECT *, LAG(action_name) OVER (ORDER BY timestamp) AS prevAction -- you may want a PARTITION also FROM YourTable ) AS t WHERE action_name = 'reference_action' GROUP BY prevAction;