我有下表:

我试图找到一种方法来获取那些过期客户的记录,然后相应地更新表(我的意思是在相关客户的customer_id中添加一条新记录,其中条目“服务过期”)。
如果您查看表的底部,您将注意到已有客户的条目“服务过期”(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,因为这是唯一没有“服务过期”条目的过期记录,该条目稍后会出现在表中。
我正在寻找一个SQL查询,它将使我能够捕获这个需求。
提前感谢
发布于 2012-12-26 20:20:35
经过一番周旋之后,我终于想出了一个解决办法:
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谢谢@木星P5为我指明了正确的方向。
致以敬意,
发布于 2012-12-26 19:12:48
效率不高,但这应该管用。
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-26 19:13:22
您的要求相当于在记录上最后一次过期后查找"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“。但是,你真的需要一个固定的数字吗?为什么不是所有的人?为什么不只是其中之一?
https://stackoverflow.com/questions/14045015
复制相似问题