[英]MySQL: how to keep top 1000 rows for each value of a column
我需要有关此查询的帮助:我想从表中删除以下行。 该表有4列:UserID,UserName,Tag,Score。
对于每个标签,我只希望保留得分最高的前1000名用户。
因此,我需要按分数排序,并为每个标签保留前1000个用户。
谢谢
根据其他答案,
DELETE FROM table t1
WHERE UserID NOT IN (SELECT userID FROM table t2
WHERE t2.tag = t1.tag
ORDER BY Score DESC LIMIT 1000);
假定UserID
是唯一/主键字段。 如果不是,则可以执行以下操作:
DELETE FROM table t1
WHERE UserID||' '||Tag NOT IN (SELECT UserID||' '||Tag FROM table t2
WHERE t2.tag = t1.tag
ORDER BY Score DESC LIMIT 1000);
放置空格是因为我知道我必须在Oracle上做类似的事情,不确定MySQL如何处理不这样做的情况。
尽管我不确定MySQL是否支持在删除查询中使用子查询,但您应该可以使用子查询来解决此问题。 我确实知道它会给更新查询带来问题(因此,我在MySQL中遇到了一些段错误)
无论哪种方式……这都应该起作用(至少在Postgres中可以)
DELETE FROM table WHERE id NOT IN (SELECT id FROM table ORDER BY Score DESC LIMIT 1000)
假设id
是您的课程主键。
使用临时表的解决方案:
请注意,您必须为每个标签重复此过程。 我想不出一种方法可以在MySQL 5.0的1个查询中完成
CREATE TEMPORARY TABLE top_users
SELECT * FROM table
WHERE Tag = ...
GROUP BY UserID
ORDER BY Score DESC
LIMIT 1000;
DELETE FROM table WHERE Tag = ...;
INSERT INTO table
SELECT * FROM top_users;
也许是一个临时表,里面有一个select子句
SELECT * FROM table ORDER BY Score DESC LIMIT 1000;
我没有用于创建临时表的语法,但是这将至少获得您想要的行。
小心删除命令...最好创建一个新的视图/表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.