【问题标题】:How do I delete every row except the last one for each day?如何每天删除除最后一行之外的每一行?
【发布时间】:2010-05-08 05:12:18
【问题描述】:

我有一张股票报价表,看起来像这样:

id、日期、stock_id、值

每个stock_id每天都有几行(每五分钟自动更新一次),所以目前表比较大。

我如何每天删除每个 stock_id 的每一行,但最后一行?

【问题讨论】:

  • 日期实际上是日期时间还是纯日期?
  • 最后一行是由当天的最后一个日期戳确定的吗?日期是 DateTime 时间戳吗?

标签: sql mysql


【解决方案1】:

其他答案不能确保每个stock_id 每天至少保留一条记录。以下应该做你想做的。

DELETE FROM StockQuotes
WHERE id NOT IN (
    SELECT MAX(id)
    FROM StockQuotes
    GROUP BY stock_id, DATE(`date`)
)

假设id 是一个按顺序自动编号的字段,date 是一个至少包含日期的日期时间字段,但我也包含小时、分钟、秒等。

【讨论】:

  • 确实是一个日期时间字段。我应该更改为 GROUP BY DATE(date) 还是需要进行其他更改?
  • @A 没问题 - 我做了一个应该支持您的日期时间字段的更改。
  • 你不能只做 MAX(date) 吗?这会调出每天的最后一次,我想这会比只使用 ID 慢
  • @Spidfire MAX(date) 将只返回最近输入的行,句点。我想你可以做DELETE FROM StockQuotes WHERE date NOT IN ( SELECT MAX(date) FROM StockQuotes GROUP BY stock_id, DATE(date)),但是你有可能同时输入股票 A 和 B 的记录(可能是批处理的一部分),这是股票 A 的最新行,但是另一个股票 B 的记录在同一天录入。在这种情况下,这将导致当天为库存 B 留下两行,这是我们不希望的。
  • 这是一个需要很长时间才能执行的查询吗?我无法让它工作。没有错误或任何东西,它只是不断加载。
【解决方案2】:

我认为这会满足您的需求:

DELETE FROM STOCK_QUOTES
  WHERE ID NOT IN (SELECT MAX(ID) AS ID
                     FROM STOCK_QUOTES
                     GROUP BY DATE, STOCK_ID));

【讨论】:

  • 与 John Rasch 的回答一样,这将丢弃除每个 date 的最大 stock_id 之外的所有 date,这是不正确的 - 它应该丢弃除每个 stock_id 的最大 id 之外的所有 stock_id每个date.
猜你喜欢
  • 2019-01-03
  • 1970-01-01
  • 2018-04-27
  • 2016-05-03
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多