0

我有一个批处理作业,我在一张桌子上运行,我确信我可以写成一个准备好的语句。目前这一切都在 Java 中,毫无疑问,它的效率低于它可能的水平。对于这样的表:

CREATE TABLE thing (
  `tag` varchar,
  `document` varchar,
  `weight` float,
)

我想创建一个新表,其中包含每个标签的前 N ​​个条目。目前我这样做:

create new table with same schema
select distinct tag
for each tag:
  select * limit N insert into the new table

这需要执行查询以获取不同tag的 s,然后选择该标签的顶部N项目并插入它们……所有这些都非常低效。

是否有我可以用来执行此操作的存储过程(甚至是简单的查询)?如果方言很重要,我正在使用 MySQL。

(是的,我确实对我的索引进行了排序!)

干杯

4

2 回答 2

1

我有一段时间没有这样做了(被 SQL Server 中的 CTE 宠坏了),我假设您的数据是按重量排序的;尝试

SELECT tag, document, weight
FROM thing
WHERE (SELECT COUNT(*)
       FROM thing as t
       WHERE t.tag = thing.tag AND t.weight < thing.weight
) < N;

我认为那会做到的。

编辑:更正了代码中的错误;需要 < N,而不是 <= N。

于 2009-10-08T19:38:15.023 回答
0

如果您使用的是 SQL Server,我建议使用 ROW_NUMBER 函数,按标签分组,然后选择 row_number < N 的位置。(换句话说,根据每个标签在标签组中的位置对每个标签的行进行排序和编号,然后从每个组中选择前 N 行。)我在这里找到了一篇关于在 MySQL 中模拟 ROW_NUMBER 函数的文章:

http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/

看看这对你有没有帮助!

于 2009-10-08T19:37:04.213 回答