【问题标题】:Select rows where previous row under ordering on one column meets some condition选择在一列上排序的前一行满足某些条件的行
【发布时间】:2014-07-10 12:22:28
【问题描述】:

我试图计算用户打开我们的电子邮件但一周内没有打开任何电子邮件的频率。查询看起来像

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

即使我发现嵌套选择,它也可能太低效了。这是一张相当大的桌子。我现在正在处理的逻辑可能还不够好,因为我需要在我关心的字段创建的对角线下方进行实际的完整笛卡尔连接。

【问题讨论】:

    标签: mysql sql select join


    【解决方案1】:

    您要查找的是相关子查询,例如:

    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)
                     );
    

    为了方便进行日期运算,我假设timestampdatetime

    为了获得最佳性能,您需要在user_email_tracking(user_id, user_email_tracking) 上建立索引。

    【讨论】:

    • 嗯,“一个解决方案是一个相关的子查询”......比如上面的
    • 我忽略了关联步骤,但效率不够。
    猜你喜欢
    • 2014-07-17
    • 2019-09-02
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多