SQL在预准备语句中选择不同项的组?

时间:2009-10-08 19:26:37

标签: sql mysql stored-procedures batch-file distinct

我有一个批处理作业,我在一个表上运行,我相信我可以写成一个准备好的语句。目前它全部都是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。

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

干杯

2 个答案:

答案 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/

看看这是否有助于你!