【问题标题】:Analytic Function: ROW_NUMBER( )解析函数: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 2
3 200000 1
3 45000 2

4 475000 1
5 50000 1
5 10000 2

6 600000 1
6 90000 2

预期结果是:
CUSTOMER_ID 总 SNO
1 70000 1
2 250000 1
2 560000 2
3 45000 1
3 200000 2

4 475000 1
5 10000 1
5 50000 2

6 600000 1
6 90000 2
TOTAL 列数据不匹配。

【问题讨论】:

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

标签: sql oracle window-functions


【解决方案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 ,我通过你分享的解决方案得到了结果,不知何故我的数据库显示错误的答案。感谢您的询问。
    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多