首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oralce sql:我想选择前3张唱片

Oralce sql:我想选择前3张唱片
EN

Stack Overflow用户
提问于 2022-06-10 02:45:45
回答 2查看 45关注 0票数 0

我想选择按'cnt‘订购的前三大唱片

这是前四名

代码语言:javascript
复制
a   b   c     cnt 
99  YC  市購件異常   3
99  LY  漏油  2
99  QT16    其他異常    2
99  JGSH    機構損壞    1

然后选择* from (),其中rownum<= 3按cnt desc排序。

获取数据

代码语言:javascript
复制
99  YC  市購件異常   3
99  LY  漏油  2
99  JGSH    機構損壞    1

我想要

代码语言:javascript
复制
99  YC  市購件異常   3
99  LY  漏油  2
99  QT16    其他異常    2
EN

回答 2

Stack Overflow用户

发布于 2022-06-10 06:06:07

试试这个:

代码语言:javascript
复制
SELECT T.a, T.b, T.c, T.cnt
FROM
(
  SELECT *, RANK() OVER(PARTITION BY a ORDER BY cnt DESC) RNK
  FROM TEST_TBL
) T
WHERE T.RNK <= 3
票数 0
EN

Stack Overflow用户

发布于 2022-06-10 06:22:00

看起来,您希望在结果中保留“重复”(在cnt列中)。

在这种情况下,我想说的是row_number解析函数帮助了:

样本数据:

代码语言:javascript
复制
SQL> with test (a, b, cnt) as
  2    (select 99, 'yc'  , 3 from dual union all
  3     select 99, 'ly'  , 2 from dual union all
  4     select 99, 'qt16', 2 from dual union all
  5     select 99, 'jgsh', 1 from dual union all
  6     --
  7     select 99, 'abc' , 2 from dual  --> yet another row with CNT = 2
  8    ),

查询从这里开始:第一列行(第11行),然后返回前3行(第15行):

代码语言:javascript
复制
  9  temp as
 10    (select a, b, cnt,
 11       row_number() over (partition by a order by cnt desc) rnk
 12     from test
 13    )
 14  select * from temp
 15  where rnk <= 3;

         A B           CNT        RNK
---------- ---- ---------- ----------
        99 yc            3          1
        99 ly            2          2
        99 abc           2          3

SQL>

因为,如果您使用rank解析函数(如Hana建议的那样),您可能会得到超过所需的3行(参见rnk列的值)(当然,这取决于您使用的数据;rank可以处理您发布的数据,但是--如果有更多的行共享相同的cnt值,它将不再工作):

代码语言:javascript
复制
 <snip>

  9  temp as
 10    (select a, b, cnt,
 11       rank() over (partition by a order by cnt desc) rnk
 12     from test
 13    )
 14  select * from temp
 15  where rnk <= 3;

         A B           CNT        RNK
---------- ---- ---------- ----------
        99 yc            3          1
        99 ly            2          2
        99 abc           2          2
        99 qt16          2          2

SQL>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72568576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档