Postgresql组中的前N个项WHERE N是可变的

时间:2014-10-07 23:03:30

标签: 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_table
order, fruit_id
10, 1
10, 3
10, 5

我有信心我可以弄清楚如何从每个组中返回一个静态数字,但每个组的变量计数都让我感到难过。有办法吗?

2 个答案:

答案 0 :(得分:3)

我认为您可以使用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是否提供不区分大小写的排序规则。

答案 1 :(得分: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

小提琴: http://sqlfiddle.com/#!15/caf4d/1/0