我有下表:
我正在尝试找到一种方法来获取已过期的客户的记录,然后相应地更新表格(通过更新我的意思是添加一条新的记录,条目'SERVICE EXPIRED'与相关的customer_id顾客)。
如果查看表格的底部,您会注意到两条记录,其中已有现有客户的条目为“SERVICE EXPIRED”(customer_id 11和16)。
我正在寻找一个SQL查询:
如果我使用以下内容:
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查询。
提前致谢
答案 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”。但是,你真的需要固定号码吗?为什么不是所有人呢?为什么不只是其中之一?