Window-Functions

在SQL中獲取具有特定值的行之前的行

  • May 19, 2021

我有一個如下表,其中使用者操作與時間戳一起儲存。我的目標是辨識在特定操作(名為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_nameusing ,。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;

引用自:https://dba.stackexchange.com/questions/291777