我有一个存储订单行(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作为单个结果。
有人可以把我推向正确的方向吗?
答案 0 :(得分:1)
我认为您正在寻找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()
(在第一个查询中)最适合将结果分配给整个表。仅当选择一行或少量行时,相关子查询才会有更好的性能。