簡體   English   中英

選擇在某一列上排序的上一行滿足某些條件的行

[英]Select rows where previous row under ordering on one column meets some condition

我試圖弄清楚用戶打開我們的電子郵件但一周沒有打開任何一封電子郵件的頻率。 查詢看起來像

select * from user_email_tracking uet1 where opened_timestamp is not null and
    select(max(opened_timestamp) from user_email_tracking where user_id = uet1.user_id
    and opened_timestamp < uet1.opened_timestamp

即使我認為嵌套選擇不正確,也可能效率太低。 這是一張相當大的桌子。 我現在正在研究的邏輯可能還不夠好,因為我實際上需要處理一個實際的完整笛卡爾連接,在我關心的字段創建的對角線以下。

您正在尋找的是一個相關的子查詢,例如:

select *
from user_email_tracking uet
where opened_timestamp is not null and
      not exists (select 1
                  from user_email_tracking uet2
                  where uet2.user_id = uet.user_id and
                        uet2.opened_timestamp >= date_add(uet1.opened_timestamp, interval -7 day)
                 );

為了便於進行日期算術,我假設timestamp是一個datetime時間。

為了獲得最佳性能,您需要在user_email_tracking(user_id, user_email_tracking)user_email_tracking(user_id, user_email_tracking)索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM