Postgresql前N项来自N为变量的组
想象一下,一桌水果按1到10的比例分级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
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在模块中提供了不区分大小写的字符串类型。