【发布时间】:2010-05-08 05:12:18
【问题描述】:
我有一张股票报价表,看起来像这样:
id、日期、stock_id、值
每个stock_id每天都有几行(每五分钟自动更新一次),所以目前表比较大。
我如何每天删除每个 stock_id 的每一行,但最后一行?
【问题讨论】:
-
日期实际上是日期时间还是纯日期?
-
最后一行是由当天的最后一个日期戳确定的吗?日期是 DateTime 时间戳吗?
我有一张股票报价表,看起来像这样:
id、日期、stock_id、值
每个stock_id每天都有几行(每五分钟自动更新一次),所以目前表比较大。
我如何每天删除每个 stock_id 的每一行,但最后一行?
【问题讨论】:
其他答案不能确保每个stock_id 每天至少保留一条记录。以下应该做你想做的。
DELETE FROM StockQuotes
WHERE id NOT IN (
SELECT MAX(id)
FROM StockQuotes
GROUP BY stock_id, DATE(`date`)
)
假设id 是一个按顺序自动编号的字段,date 是一个至少包含日期的日期时间字段,但我也包含小时、分钟、秒等。
【讨论】:
DELETE FROM StockQuotes WHERE date NOT IN ( SELECT MAX(date) FROM StockQuotes GROUP BY stock_id, DATE(date)),但是你有可能同时输入股票 A 和 B 的记录(可能是批处理的一部分),这是股票 A 的最新行,但是另一个股票 B 的记录在同一天录入。在这种情况下,这将导致当天为库存 B 留下两行,这是我们不希望的。
我认为这会满足您的需求:
DELETE FROM STOCK_QUOTES
WHERE ID NOT IN (SELECT MAX(ID) AS ID
FROM STOCK_QUOTES
GROUP BY DATE, STOCK_ID));
【讨论】:
date 的最大 stock_id 之外的所有 date,这是不正确的 - 它应该丢弃除每个 stock_id 的最大 id 之外的所有 stock_id每个date.