我想选择按'cnt‘订购的前三大唱片
这是前四名
a b c cnt
99 YC 市購件異常 3
99 LY 漏油 2
99 QT16 其他異常 2
99 JGSH 機構損壞 1然后选择* from (),其中rownum<= 3按cnt desc排序。
获取数据
99 YC 市購件異常 3
99 LY 漏油 2
99 JGSH 機構損壞 1我想要
99 YC 市購件異常 3
99 LY 漏油 2
99 QT16 其他異常 2发布于 2022-06-10 06:06:07
试试这个:
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发布于 2022-06-10 06:22:00
看起来,您希望在结果中保留“重复”(在cnt列中)。
在这种情况下,我想说的是row_number解析函数帮助了:
样本数据:
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行):
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值,它将不再工作):
<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>https://stackoverflow.com/questions/72568576
复制相似问题