Postgresql前N项来自N为变量的组

Postgresql前N项来自N为变量的组,sql,postgresql,Sql,Postgresql,想象一下,一桌水果按1到10的比例分级 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个最好的橙子的ID加入/分组订单和水果表,例如上面表格的结果是:1,3,5 result_tab

想象一下,一桌水果按1到10的比例分级

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个最好的橙子的ID加入/分组订单和水果表,例如上面表格的结果是:1,3,5

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

我很有信心我能找出如何从每个组返回一个静态数字,但是每个组的一个可变计数让我感到困惑。有没有办法做到这一点?

我认为您可以使用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关键字顺序命名表可能不是最好的主意

这是一个例子。注:由于示例中的情况不同,我不得不使用lower来比较水果和物品。我不确定Postgres是否提供不区分大小写的排序规则

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

小提琴:非常好!现在我可以开始我成功的水果经销商生涯了!当然,我真正的问题与fruit无关,但您的解决方案非常抽象。值得一提的是,Postgres在模块中提供了不区分大小写的字符串类型。