我试图编写一个删除查询,根据日期从数据库中删除旧记录,但问题是同一天可能有多个记录,我只需要保留最新记录。
这是我的疑问:
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订购 保持每一天的第一行 删除每天的其余部分
答案 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