我的表格有4列(id
,name
,value
,group
)和~150,000行。
我需要删除name
列值以相同字符串(uuid)结尾的任何两行集的所有出现,并且第二行的value
列值在指定之前日期。
name
列值始终以两个字符串中的一个开头:st1_
始终在value
列中包含json数据,st2_
在value
中始终具有unix时间戳{1}}栏。
以下是一个示例集(group
列已删除,因为它无关紧要):
╔════╦═══════════╦════════════╗
║ id ║ name ║ value ║
╠════╬═══════════╬════════════╣
║ 1 ║ st1_uuid1 ║ {json} ║
║ 2 ║ st2_uuid1 ║ 1448880401 ║
║ 3 ║ st1_uuid2 ║ {json} ║
║ 4 ║ st2_uuid2 ║ 1448880414 ║
║ 5 ║ st1_uuid3 ║ {json} ║
║ 6 ║ st2_uuid3 ║ 1448880468 ║
╚════╩═══════════╩════════════╝
在此示例中,如何根据其unix时间戳写入删除行1-4的查询?
答案 0 :(得分:1)
以下查询应该可以正常运行,假设在确定重复项时,所有出现多次的uuid
值都应该一起考虑。
DELETE FROM yourTable
WHERE RIGHT(name, 32) IN (SELECT *
FROM (SELECT RIGHT(name, 32) FROM yourTable
GROUP BY RIGHT(name, 32)
HAVING COUNT(*) > 1 AND
MIN(CASE WHEN value REGEXP '[0-9]+' THEN CAST(value AS UNSIGNED) ELSE ~0 END) < someValue
) AS t
)
以下是SQL Fiddle,证明GROUP BY
查询正确识别了应在给定时间戳uuids
下删除的记录中的someValue
:
答案 1 :(得分:0)
此查询创建一个字符串,如&#34; st1_uuid1,st2_uuid1,st1_uuid3,st2_uuid3,&#34;带有需要删除的变量名称,并检查每个记录的名称是否在此字符串中。
DELETE FROM Table1 WHERE
INSTR((SELECT * FROM (
SELECT GROUP_CONCAT( CONCAT('st1_uuid',SUBSTRING(name,9),',',name) SEPARATOR ', ')
FROM Table1 WHERE value REGEXP '^[0-9]+$' AND value<1448880414) as t), name);
如果可以假设变量st1_uuidX和st2_uuidX将具有连续的id号,那么如果我们知道st2_uuidX的id号,那么st1_uuidX的id应该是1减去st2_uuidX的id。
FROM Table1 WHERE id IN
(SELECT * FROM (SELECT id FROM Table1 WHERE value REGEXP '^[0-9]+$' AND value<1448880414) as t)
OR id IN (SELECT * FROM (SELECT id-1 FROM Table1 WHERE value REGEXP '^[0-9]+$' AND value<1448880414) as r)
两个查询都经过测试。