在同一天删除旧行

时间:2018-02-10 03:44:36

标签: mysql sql

我试图编写一个删除查询,根据日期从数据库中删除旧记录,但问题是同一天可能有多个记录,我只需要保留最新记录。

这是我的疑问:

SELECT
    ItemName,
    1_PRICE,
    1_STOCK,
    2_STOCK,
    updated
FROM
    inventory 
WHERE
    ItemName = "24T7351" 
ORDER BY 
    updated DESC

这里是SQLFiddle: http://sqlfiddle.com/#!9/fb0a3d/1

基本上我想要的是一个查询,它返回按天分组的所有记录,除了每天最近的记录。

伪代码:     选择 *     分组更新     通过desc订购     保持每一天的第一行     删除每天的其余部分

4 个答案:

答案 0 :(得分:2)

这样的事情怎么样:

DELETE FROM inventory
WHERE updated NOT IN (
    SELECT updated FROM (
        SELECT MAX(updated) updated
        FROM inventory
        GROUP BY DATE(updated)
    ) i
)

如果你有updated索引(已订购)。

,这将很有效

基本上,子查询获取每天所有最大更新日期,并从NOT IN语句中排除它们(DELETE)。

答案 1 :(得分:0)

获取子查询中的最近时间,将其与表格连接,然后删除。

DELETE i1 
FROM inventory AS i1
JOIN (SELECT DATE(updated) AS date, MAX(updated) AS latest
      FROM inventory
      WHERE itemname = '24T7351'
      GROUP BY date) AS i2 ON DATE(i1.updated) = i2.date AND i1.updated != i2.latest
WHERE itemname = '24T7351'

答案 2 :(得分:0)

如果您希望每个项目的每个日期都有最新记录:

SELECT i.*
FROM inventory i
WHERE i.updated < (select max(i2.updated)
                   from inventory i2
                   where i2.itemname = i.itemname and
                         date(i2.updated) = date(i.updated)
                  )
ORDER BY updated DESC;

答案 3 :(得分:0)

此解决方案可帮助您为每个行分配排名。您可以根据排名删除。最新记录的排名为1。

SELECT
    ItemName,
    BLOCK_1_PRICE,
    M,
    S,
    B,
    P,
    updated,
    if (ItemName=@curItem,@curRank:= @curRank + 1, @curRank:=@reset) AS rank,
    @curItem:=ItemName,
    @curRank,
  @reset,
  @curItem
FROM
    inventory, (select @curRank:=1, @curItem:='NA', @reset:= 1) as r
ORDER BY 
    ItemName,updated DESC

如果您想要除最新记录之外的所有记录,请使用以下查询。如果库存表很大,我建议您创建一个包含最新记录的新表,而不是在旧表中删除。链接到SQLFiddle(http://sqlfiddle.com/#!9/fb0a3d/20

select * from 
(
SELECT
    ItemName,
    BLOCK_1_PRICE,
    M,
    S,
    B,
    P,
    updated,
    if (ItemName=@curItem,@curRank:= @curRank + 1, @curRank:=@reset) AS rank,
    @curItem:=ItemName,
    @curRank,
  @reset,
  @curItem
FROM
    inventory, (select @curRank:=1, @curItem:='NA', @reset:= 1) as r
ORDER BY 
    ItemName,updated DESC
  ) as t
  where rank > 1