2015-07-13 2 views
0

Каждая запись содержит RecordID, TypeID, GroupID.
Существует много записей для Type и многих типов для Group.
Я хочу вернуть 3 записи для каждой комбинации типа и группы.Выберите ограниченное количество записей для каждой группы.

Любые предложения?

упрощенный выход как этот

Group | Type | Record 
------+------+-------- 
1  | 1 | 1 
1  | 1 | 2 
1  | 1 | 3 
1  | 2 | 1 
1  | 2 | 2 
1  | 2 | 3 
1  | 3 | 1 
.... 
9  | 1 | 1 
9  | 2 | 2 
etc.. 

Этого решение, которое работает для меня, вариации ответа.

Это код для миграции, поэтому абсолютная оптимизация не нужна - но оцените дальнейшие указатели.

SELECT * 
FROM yourTable t1 
WHERE EXISTS 
    (SELECT RecordId 
    FROM (
     SELECT RecordId, ROW_NUMBER() OVER (PARTITION BY GroupId, TypeId ORDER BY RecordId) As seq FROM yourTable) t2 
     WHERE seq <= 3 AND t2.RecordId = t1.RecordId 
    ) 
ORDER BY GroupId, TypeId 
+0

Short сделать несколько петель, я читал на «возможные решения» - некоторые здесь http://stackoverflow.com/questions/2129693/ использование-limit-in-group-by-to-get-n-results-per-group - много сложнейших запросов и терминов, которые я не знаком с –

ответ

1

попробовать что-то вроде этого:

SELECT * 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY GroupId, TypeId ORDER BY RecordId) As seq 
    FROM yourTable) dt 
WHERE seq <= 3 
+0

Спасибо, это выглядит чистым - я попытаюсь устранить его. Ошибка в командной строке: 3 Столбец: 13 Отчет об ошибке - Ошибка SQL: ORA-00923: ключевое слово FROM не найдено, где ожидалось –

+0

Не помогло устранить ошибку, боюсь, извините. –

+0

Этот запрос выполняется нормально, если я заменю * для некоторых фактических полей - я мог бы использовать select * из таблицы, где IN те результаты - или что-то, будут публиковать, когда я его получу. Спасибо –

Смежные вопросы