想象一下按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
我有信心我可以弄清楚如何从每个组中返回一个静态数字,但每个组的变量计数都让我感到难过。有办法吗?
答案 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