繁体   English   中英

MySQL:如何为一列的每个值保留前1000行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM