解析函数:ROW_NUMBER( )

Posted

技术标签:

【中文标题】解析函数:ROW_NUMBER( )【英文标题】:Analytic Function: ROW_NUMBER( ) 【发布时间】:2018-11-21 11:07:56 【问题描述】:

我有一张“发票”表

id integer Primary key
customer_id Integer
total Number (*,2)

查询是向别名为“SNO”的每个客户显示所有customer_id、total 和running 序列号。并且记录应该根据customer_id升序显示,然后按SNO显示。

提示:

分析函数:ROW_NUMBER( ) 分析子句:query_partition_clause 和 order_by_clause。

我写了以下查询:

Select customer_id,
       total,
       ROW_NUMBER( ) OVER (PARTITION BY customer_id ORDER BY customer_id ASC) AS "SNO"
from invoice;

但是结果失败了。我错过了什么。还有什么意思是“记录应该根据customer_id然后按SNO升序显示”。

我得到的结果如下: CUSTOMER_ID 总 SNO 1 70000 1 2 250000 1 2 560000 23 200000 1 3 45000 2 4 475000 15 50000 1 5 10000 2 6 600000 1 6 90000 2

预期结果是: CUSTOMER_ID 总 SNO 1 70000 1 2 250000 1 2 560000 23 45000 1 3 200000 2 4 475000 15 10000 1 5 50000 2 6 600000 1 6 90000 2 TOTAL 列数据不匹配。

【问题讨论】:

你得到什么错误? “结果失败”——这是什么意思?你有错误吗?错误的结果?按同一列进行分区和排序是奇数且不确定的;是否有其他列,例如您可以订购的时间戳? “然后由 SNO” 并没有真正帮助你生成...... 我得到了错误的结果。没有时间戳列。 你得到的结果 are 由 SNO 排序(尽管正如 dnoeth 提到的,你仍然应该有一个明确的 order-by 子句真的)。您似乎希望它们按总数排序,并让 SNO 进行跟踪;但是您的问题和您似乎引用的作业实际上并没有说明应该如何找到“运行序列号”。将您的row_number() 更改为按idtotal 订购似乎是显而易见的步骤,但目前尚不清楚哪个(如果有的话)是正确的,因为在您向我们展示的内容中没有指定。 【参考方案1】:

您已经接近了,您可能需要通过id 订购row_number(假设它是基于时间升序的)

Select customer_id,
       total,
       ROW_NUMBER( ) OVER (PARTITION BY customer_id ORDER BY id ASC) AS "SNO"
from invoice
order by customer_id, "SNO" -- should be the default anyway (but there's no guarantee)

【讨论】:

【参考方案2】:

我在您的查询中没有找到任何 order by 子句,另一个问题是您要生成 SNO 的顺序?使用idtotal 会影响您的订购

 with cte as
(
select  1  cid, 70000  total from dual
    union all
select 2, 250000 from dual
    union all
select 2, 560000 from dual
union all
select 3, 200000 from dual
    union all
select 3, 45000  from dual
    union all
select 4, 475000 from dual
union all
select 5, 50000 from dual
union all
select 5, 10000 from dual
union all
select 6, 600000 from dual
union all
select 6, 90000 from dual

)Select cid,total,ROW_NUMBER( ) OVER (PARTITION BY cid ORDER BY total ) AS "SNO" from cte order by cid,SNO

【讨论】:

@ Zaynul Abadin Tuhin ,我通过你分享的解决方案得到了结果,不知何故我的数据库显示错误的答案。感谢您的询问。

以上是关于解析函数:ROW_NUMBER( )的主要内容,如果未能解决你的问题,请参考以下文章

从 ROW_NUM 中仅选择编号最大的行以获取最新更新

解析函数:ROW_NUMBER( )

Row_number() 和 group by 一起不起作用

Oracle row_number() over()解析函数高效实现分页

SQL分页查询,纯Top方式和row_number()解析函数的使用及区别

SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同