2014-10-07 2 views
1

Представьте таблицу фруктов градуированных по шкале от 1 до 10.Postgresql Топ N элементы из группы, где N является переменной

id, fruit, grade 
1, Apple, 1 
2, Orange, 5 
3, Apple, 4 
4, Apple, 7 
5, Orange, 4 

и порядок таблица:

order_id, item, quantity 
10, apple, 2 
10, orange 1 

Запроса для Приказ № 10 говорит мне, что мне нужно отправить 2 яблока и 1 апельсин.

Есть ли способ присоединиться к группе из 2 лучших яблок и выбрать один из лучших фруктов, а также 1 лучший апельсин, такой как результат с таблицей выше: 1,3,5?

result_table 
order, fruit_id 
10, 1 
10, 3 
10, 5 

Я уверен, я мог понять, как вернуть статический номер из каждой группы, а переменная счетчика из каждой группы топала меня. Есть ли способ сделать это?

ответ

2

Я думаю, вы будете иметь возможность использовать row_number() для достижения этой цели:

with f as (
    select 
    id fruit_id, 
    fruit, 
    row_number() over (partition by fruit order by grade) rn 
    from 
    fruit 
) 
select 
    o.order_id, 
    f.fruit_id 
from 
    f 
    inner join 
    "order" o 
    on o.item = f.fruit 
where 
    f.rn <= o.quantity 

Именование таблицы после ключевого слова SQL (заказ) может быть не самой лучшей идеей.

Вот Exaple SQLFiddle. Примечание. Мне пришлось использовать lower, чтобы сравнить фрукты с товаром, поскольку случаи в этом примере отличаются. Я не уверен, что Postgres предлагает нечувствительные к регистру сортировки.

+0

Очень хорошо! Теперь я могу начать свою успешную карьеру в качестве дистрибьютора фруктов! (Конечно, моя настоящая проблема не имеет ничего общего с фруктами, но ваше решение прекрасно абстрагируется). –

+0

Для чего Postgres предоставляет строковый тип без учета регистра в модуле ['citext'] (http://www.postgresql.org/docs/9.3/static/citext.html). –

0
select order_id, fruit_id 
    from (select order_id, 
       f.id as fruit_id, 
       f.grade, 
       o.quantity, 
       row_number() over(partition by f.fruit order by f.grade) as rn 
      from "order" o 
      join fruit f 
      on o.item = f.fruit) x 
where quantity >= rn 

Fiddle:http://sqlfiddle.com/#!15/caf4d/1/0

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