返回PostgreSQL中的行数

时间:2019-01-09 16:17:46

标签: sql postgresql

我有一个存储订单行(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作为单个结果。

有人可以把我推向正确的方向吗?

1 个答案:

答案 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()(在第一个查询中)最适合将结果分配给整个表。仅当选择一行或少量行时,相关子查询才会有更好的性能。