如何在 oracle sql 查询中生成行项目编号

Tha*_*ing 2 sql oracle

这似乎应该是一个已经解决的经典发票项目问题,但也许我在搜索中没有使用正确的词。

我正在运行这样的查询(这只是一个简单的例子,我的实际查询要复杂得多,但它返回相同的结果):

select invoice.inv_num, item.name, item.qty 
 from invoice invoice, item 
 where invoice.inv_num = item.inv_num
 order by invoice.inv_num
Run Code Online (Sandbox Code Playgroud)

我需要生成一个项目编号列,该列为每个项目递增,但每个新发票编号从 1 开始。因此,例如,我需要最终结果如下所示:

inv_num   item_num   name            qty
-------   --------   -------------   ---
111       1          red widgets     10
111       2          blue widgets    5
222       1          green_widgets   7
222       2          red_widgets     16
222       3          black_widgets   10
333       1          blue_widgets    8
333       2          red_widgets     12
Run Code Online (Sandbox Code Playgroud)

我们仍在使用 Oracle 9i 以防万一。

Raj*_*thi 5

您可以使用 oracle rank 或 row_number 分析函数(取决于您希望如何处理重复项/同等排名项)。

以下是将第 4 列 item_number 添加到查询的方法:

select invoice.inv_num, item.name, item.qty ,
       row_number() over (partition by inv_num order by qty desc) item_num
 from invoice invoice, item 
 where invoice.inv_num = item.inv_num
 order by invoice.inv_num
Run Code Online (Sandbox Code Playgroud)
  • 由于 partition by 子句,计数器会在每个新发票编号处重置。
  • 在发票中,等级/项目编号由数量(从高到低)决定。
  • 在上面的查询中,rank 或 row_number 将给出与您的数据相同的结果。但是如果发票中有多个相同数量的项目(10 个红色,10 个蓝色小部件),rank 会给你相同的项目编号,所以在这种情况下 row_number 是合适的。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm#i81407