SQL Query用于获取具有某些条件的最后一组不同记录

时间:2012-12-26 19:06:20

标签: mysql sql

我有下表:

enter image description here

我正在尝试找到一种方法来获取已过期的客户的记录,然后相应地更新表格(通过更新我的意思是添加一条新的记录,条目'SERVICE EXPIRED'与相关的customer_id顾客)。

如果查看表格的底部,您会注意到两条记录,其中已有现有客户的条目为“SERVICE EXPIRED”(customer_id 11和16)。

我正在寻找一个SQL查询:

  1. 通过customer_id
  2. 获取最后一组不同的记录
  3. 从结果集中排除同一customer_id的记录,该结果集的表格中显示条目“SERVICE EXPIRED”或status_id为2
  4. 如果我使用以下内容:

    SELECT MAX(id) FROM mytable WHERE status_id != '2' AND expiry < '2012-12-26 19:00:00' GROUP BY customer_id
    

    它将返回ID 1,11,13和16.但是,我不想要ID 11和16,因为到期状态已在后面的表中注明(参见表的最后两个记录) ,并且ID 1已经更新,可以在后面的id 3中看到更新的到期日期。我想要的只是id 13,因为这是唯一一个没有“SERVICE EXPIRED”条目的过期记录,该条目出现在表格的后面。

    我正在寻找能够捕获此要求的SQL查询。

    提前致谢

3 个答案:

答案 0 :(得分:1)

经过一番摆弄后,我设法找到了解决方案:

SELECT MAX(id) 
FROM mytable
WHERE status_id != '2' 
    AND expiry < '2012-12-26 19:00:00' 
    AND customer_id NOT IN (SELECT MAX(customer_id) FROM mytable WHERE status_id = '2' GROUP BY customer_id) 
GROUP BY customer_id

感谢@ JupiterP5让我指向正确的方向。

此致

答案 1 :(得分:0)

效率不高,但这应该有效。

SELECT MAX(id)
FROM mytable
WHERE status_id != '2'
    AND expiry < '2012-12-26 19:00:00'
    AND id NOT IN (SELECT id FROM mytable where status_id = 2)
GROUP BY customer_id

编辑:错过了续订的服务案例。如果我想到的话,我会更新。

答案 2 :(得分:0)

您的要求相当于在记录上次到期后查找“n”条记录。以下查询返回给定客户上次到期后的所有记录:

select t.*
from t join
     (select t.customer_id, MAX(id) as maxid
      from t
      where status_id = 2
     ) texp
     on t.customer_id = texp.customer_id and
        t.id > texp.maxid

通过巧妙地使用变量,您可以枚举这些变量以获得最后的“n”。但是,你真的需要固定号码吗?为什么不是所有人呢?为什么不只是其中之一?