2013-08-14 5 views
2

У меня есть следующие таблицы в PostgreSQL:Выберите 5 из каждого отдельного значения

 
| a | b | c | 
=================== 
| 'w' | 2 | 3 | 
| 'w' | 7 | 2 | 
| 'w' | 8 | 1 | 
| 'w' | 3 | 6 | 
| 'w' | 0 | 8 | 
| 'w' | 2 | 9 | 
| 'w' | 2 | 9 | 
| 'z' | 4 | 9 | 
| 'z' | 0 | 9 | 
| 'z' | 0 | 8 | 
| 'z' | 3 | 6 | 
| 'z' | 2 | 7 | 
| 'z' | 3 | 1 | 
| 'z' | 3 | 2 | 
| 'z' | 3 | 3 | 

Я хочу, чтобы выбрать все записи, но ограничить их 5 записей для каждого отдельного значения в столбце a.
Таким образом, результат будет выглядеть следующим образом:

 
| a | b | c | 
=================== 
| 'w' | 2 | 3 | 
| 'w' | 7 | 2 | 
| 'w' | 8 | 1 | 
| 'w' | 3 | 6 | 
| 'w' | 0 | 8 | 
| 'z' | 4 | 9 | 
| 'z' | 0 | 9 | 
| 'z' | 0 | 8 | 
| 'z' | 3 | 6 | 
| 'z' | 2 | 7 | 

Самый эффективный способ добиться того, что в RoR? Благодаря!

+0

[Если один из ниже ответа решить вашу проблему, пожалуйста, отметьте его как правильный ответ, смотрите здесь, как] (http://stackoverflow.com/about) – Romesh

ответ

3

вы можете использовать row_number, но вы должны указать порядок или вы получите непредсказуемые resutls

with cte as (
     select 
      *, 
      row_number() over(partition by a order by b, c) as row_num 
     from table1 
    ) 
    select a, b, c 
    from cte 
    where row_num <= 5 
+0

Спасибо, сработало! – konnigun