Partitioning

每個非空值之前的空行數

  • August 2, 2021

我需要回答以下問題:

在客戶打開電子郵件之前,平均發送電子郵件的次數是多少?我知道我需要計算每個 Open_Date 之間的行數,以便獲得每次打開之間發送的電子郵件數量。我意識到我需要為此添加 row_number () 函式,但我似乎無法在第二個螢幕截圖中找到所需的列。

需要記住的一點是,我需要每個電子郵件地址平均獲得一個“CounttilOpens”。在下面的範例中,我有兩個不同的電子郵件地址以及它們各自的發送和打開日期,並且我需要查詢來為每個電子郵件地址獨立執行。

我的資料結構如下:

在此處輸入圖像描述

我需要一個查詢來幫助我獲得一個像這樣的新列,該列會針對每個電子郵件地址和每個開放日期間隔重新啟動:

在此處輸入圖像描述

**這是一種差距和孤島問題。**有許多不同的解決方案。

  • 由於COUNT(SomeValue)只會計算非空值,因此您可以使用視窗計數來計算每個島的分組 ID。
  • 我們為不為空的每一行減去 1,以便將其保留為前一組的一部分
  • 然後我們使用另一個視窗化COUNT來獲得最終結果,這次也按組 ID 進行分區。
SELECT
 Email,
 Send_Date,
 Open_Date,
 CASE WHEN Open_Date IS NOT NULL THEN
     COUNT(*) OVER (PARTITION BY Email, GroupId ORDER BY Send_Date)
   END AS CountTilOpen
FROM (
   SELECT *,
       COUNT(Open_Date) OVER (PARTITION BY Email ORDER BY Send_Date)
         - CASE WHEN Open_Date IS NULL THEN 0 ELSE 1 END
         AS GroupId
   FROM YourTable t
) t;

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