Partitioning
每個非空值之前的空行數
我需要回答以下問題:
在客戶打開電子郵件之前,平均發送電子郵件的次數是多少?我知道我需要計算每個 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;