SQL выбрать группы различных элементов в подготовленном утверждении? - PullRequest
0 голосов
/ 08 октября 2009

У меня есть пакетное задание, которое я запускаю на столе, которое, я уверен, я мог бы написать как подготовленное утверждение. В настоящее время все это на 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 ]

1 голос
/ 08 октября 2009

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

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

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

РЕДАКТИРОВАТЬ: исправлена ​​ошибка в коде; нужно

0 голосов
/ 08 октября 2009

Если бы вы использовали SQL Server, я бы предложил использовать функцию ROW_NUMBER, сгруппированную по тегу, и выбрать где row_number

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...