我有一个批处理作业,我在一个表上运行,我相信我可以写成一个准备好的语句。目前它全部都是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
,然后选择该标记的顶级N
项并插入它们......所有这些都非常低效。
我可以使用存储过程(甚至简单的查询)来执行此操作吗?如果方言很重要,我正在使用MySQL。
(是的,我确实对索引进行了排序!)
干杯
乔
答案 0 :(得分: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;
我认为会这样做。
编辑:修正了代码中的错误;需要&lt; N,不是&lt; = N。
答案 1 :(得分:0)
如果您使用的是SQL Server,我建议使用按标签分组的ROW_NUMBER函数,并选择row_number&lt; N.(换句话说,根据它们在标签组中的位置对每个标签的行进行排序和编号,然后从每个组中选择前N行。)我在这里找到了一篇关于在MySQL中模拟ROW_NUMBER函数的文章: / p>
http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/
看看这是否有助于你!