2009-10-08 3 views
0

У меня есть пакетное задание, которое я запускаю на столе, который, я уверен, мог бы написать как подготовленный оператор. В настоящее время все это на Java и, без сомнения, менее эффективно, чем могло бы быть. За столом, как так:SQL выбирает группы отдельных элементов в подготовленном сообщении?

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

Если вы используете SQL Server, я предложил бы использовать функцию row_number, сгруппированных по тэгу, и выберите where row_number < N. (Другими словами, упорядочьте и запишите строки для каждого тега в соответствии с их положением в группе тегов, затем выберите верхние N строк из каждой группы.) Я нашел статью о моделировании функции ROW_NUMBER в MySQL здесь:

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

Посмотрите, поможет ли это вам!

1

Я не сделал этого некоторое время (испорченный CTE в SQL Server), и я предполагаю, что ваши данные упорядочены по весу; try

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

Я думаю, что это сделаю.

EDIT: исправлена ​​ошибка в коде; необходимо < N, а не < = N.

+0

Несомненно, что бы получить все веса под значением N? То, что я хочу, это верхние значения N (т. Е. 'LIMIT N'). – Joe

+0

Если вы используете <= thing.weight, то вам нужно <= N. Если вы используете