1

我有下表:

在此处输入图像描述

我正在尝试找到一种方法来获取那些已过期的客户的记录,然后相应地更新表(通过更新我的意思是添加一条新记录,其中包含相关客户的 customer_id 条目)。

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

我正在寻找一个 SQL 查询,它将:

  1. 通过 customer_id 获取最后一组不同的记录
  2. 从结果集中排除相同 customer_id 的记录,这些记录具有条目“SERVICE EXPIRED”或 status_id 为 2 稍后出现在表中

如果我使用以下内容:

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

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

我正在寻找一个 SQL 查询,它可以让我捕捉到这个需求。

提前致谢

4

3 回答 3

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 为我指明了正确的方向。

问候,

于 2012-12-26T20:20:35.233 回答
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

编辑:错过了服务更新案例。如果我想到什么,我会更新。

于 2012-12-26T19:12:48.310 回答
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”。但是,你真的需要一个固定的号码吗?为什么不是全部?为什么不只是其中之一?

于 2012-12-26T19:13:22.010 回答