回答

收藏

如何在Oracle选前100行?

技术问答 技术问答 147 人阅读 | 0 人回复 | 2023-09-14

我的要求是获得每个客户的最新订单,然后获得前100条记录。
8 R6 S5 b8 ?9 l* M) B8 C我写了一个查询,如下所示,以获得每个客户的最新订单。内部查询工作正常。但我不知道如何根据结果获得前100名。
5 C5 {- D$ x" a5 u  E$ y' N- o                SELECT * FROM (      SELECT id,client_id,ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn       FROM order   ) WHERE rn=1有什么想法吗?
$ `3 U+ m, g: g& G                                                                ( p1 Y3 F: V1 A8 @
    解决方案:                                                                * L/ t4 \$ G$ Z/ x  c
                                                                假设create_time包括创建订单的时间,你想要100个有最新订单的客户,可以:
, b4 s, X- P/ S' d/ ?' w添加到最内部的查询中create_time) O/ j* i. f) l9 {; p) ]& D# k
通过以下命令对外部查询结果进行排序 create_time desc* c# @' R3 c$ t( C' _
添加最外层查询,该查询使用以下内容过滤前100行 ROWNUM
询问:
: L: C* e' B8 R0 a" ?3 o( m5 f        SELECT * FROM (     SELECT * FROM (        SELECT           id,          client_id,          create_time,         ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn         FROM order     WHERE rn=     ORDER BY create_time desc  ) WHERE rownum Oracle 12c的更新
8 X+ h1 r! z3 `' m& K- y在版本12.1中,Oracle引入真 Top-N查询。使用新的FETCH FIRST...您还可以使用语法:; N% S; B- @( G1 @
        SELECT * FROM  SELECT       id,      client_id,      create_time,     ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn     FROM order )  WHERE rn = 1  ORDER BY create_time desc  FETCH FIRST 100 ROWS ONLY)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则