我有一个存储订单行(salesrow_id)的地方,所以发票的一行,这是订单的一部分order_id和为该项目支付的价格
salesrow_id(pk) | order_id | price | name
10 1 5 spaghetti
11 1 4 pizza
12 2 6 salami
13 1 1 vegetables
我试图实现的是按order_id和salesrow_id获取发票上的行号。例如:salesrow_id=13,order_id=1 应返回 3,因为如果按salesrow_id排序,它是订单 1 发票上的第三项。
我尝试使用 row_number 进行查询,但这仅在我返回多行时才有效,并且我只想将数字 3 作为单个结果。
有人能把我推向正确的方向吗?
您正在寻找row_number()
,我认为:
select t.*,
row_number() over (partition by order_id order by sales_row_id) as rownumber
from t;
如果您希望对单行执行此操作,请使用子查询和筛选器:
select t.*
from (select t.*,
row_number() over (partition by order_id order by sales_row_id) as rownumber
from t
) t
where sales_row_id = 13;
如果您关心性能,相关子查询可能会更好:
select t.*,
(select count(*)
from t t2
where t2.order_id = t.order_id and t2.sales_row_id <= t.sales_row_id
) as rownum
from t
where t.sales_row_id = 13;
请注意,row_number()
(在第一个查询中)最适合将结果分配给整个表。 仅当您选择一行或少量行时,相关子查询才会具有更好的性能。