【问题标题】:SQL Query to find users with no record within the last 30 days, but with a record within the last 90 daysSQL 查询查找过去 30 天内没有记录但在过去 90 天内有记录的用户
【发布时间】:2013-07-08 21:21:46
【问题描述】:

我正在尝试构建一个查询,该查询将列出表中在过去 90 天内但不是在过去 30 天内有条目的所有用户 ID。

一个超级简化版的表格将包含三个字段:RecordID(主键,自动增量)、UserID(外键)和 RecordDate(时间戳)。

我知道如何在两个查询中执行此操作,但可以在一个查询中完成吗?它应该返回任何用户的用户 ID,其条目少于 90 天,但在过去 30 天内没有条目。

【问题讨论】:

    标签: mysql


    【解决方案1】:
    select distinct(userid) 
      from thetable 
     where recorddate > DATE_SUB(now(), INTERVAL 90 DAY)
       and userid not in 
          (
            select userid 
              from thetable 
             where recorddate > DATE_SUB(now(), INTERVAL 30 DAY)
          )
    

    我不太了解 mySQL,所以请使用适当的方式检查日期是否在最近 x 天内

    我假设一个用户 ID 可以在表中多次出现,但您只希望它们返回一次。因此“与众不同”

    【讨论】:

    • 这看起来很接近,但“and recordid not in”不应该是“and userid not in”吗?
    【解决方案2】:

    以下查询应该可以完成这项工作:

    SELECT UserID 
    FROM MyTable AS T1
    WHERE 
      (SELECT MIN(DATEDIFF(NOW(),RecordDate)) 
       FROM MyTable AS T2                           -- Most recent entry must be more
       WHERE T2.UserID=T1.UserId) BETWEEN 31 AND 90 -- than 30 days ago, but no more
                                                    -- than 90 days ago
    

    【讨论】:

    • 我不认为这是“过去 30 天内没有发送记录”的原因,它只查找在过去 30-90 天内发送过的用户
    • @Ben,我修改了查询以考虑您的其他条件。我现在无法访问 MySQL,但请试一试。
    【解决方案3】:
    SELECT UserID
    FROM
    (
       SELECT UserID, 
              MIN(RecordDate) AS min_date,
              MAX(RecordDate) AS max_date
         FROM MyTable
              GROUP BY UserID
    )
    WHERE max_date <  AddDate(CURRENT_TIMESTAMP, INTERVAL -30 DAY)
      AND min_date >= AddDate(CURRENT_TIMESTAMP, INTERVAL -90 DAY)
    

    【讨论】:

      【解决方案4】:

      应该这样做

      SELECT DISTINCT UserID 
      FROM Table t1    
      WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 90 DAY)
      AND NOT EXISTS (
        SELECT 1 FROM Table
        WHERE RecordDate > DATE_SUB(NOW(), INTERVAL 30 DAY)
        AND UserID = t1.UserID
      )
      

      【讨论】:

        最近更新 更多