son*_*onu 3 sql oracle greatest-n-per-group
我在表中有2列.第1列代表不同公司的名称,第2列显示产品数量.
COL 1 COL 2
CompA 2323
CompB 2320
CompC 1999
CompD 1598
CompE 1400...so on
Run Code Online (Sandbox Code Playgroud)
我想要做的是显示前10行显示前10个公司名称及其在desc顺序中的计数.然后我想比较第10个公司数和第11个公司数.如果匹配,则显示第11个公司名称及其计数.如果第10个公司计数与第11个公司计数不匹配,则仅显示前10个记录.
我只读访问权限,因此无法在表中更新或插入新记录.
如何才能做到这一点?
如果您想要做的是显示前十个计数,包括关系.这是用简单的解析函数来解决,如RANK()或DENSE_RANK()...
SQL> select * from
2 ( select
3 ename
4 , sal
5 , rank() over (order by sal desc) sal_rank
6 from emp
7 )
8 where sal_rank <= 10
9 /
ENAME SAL SAL_RANK
---------- ---------- ----------
QUASSNOI 6500 1
SCHNEIDER 5000 2
FEUERSTEIN 4500 3
VERREYNNE 4000 4
LIRA 3750 5
PODER 3750 5
KESTELYN 3500 7
TRICHLER 3500 7
GASPAROTTO 3000 9
ROBERTSON 2990 10
RIGBY 2990 10
11 rows selected.
SQL>
Run Code Online (Sandbox Code Playgroud)
请注意,如果RIGBY与GASPAROTTO具有相同的工资,那么他们的SAL_RANK将为9,ROBERTSON将为11,结果集将包含10行.
DENSE_RANK()它的不同之处RANK()在于它总是返回前十名的粉丝,而不是跳过领带......
SQL> select * from
2 ( select
3 ename
4 , sal
5 , dense_rank() over (order by sal desc) sal_rank
6 from emp
7 )
8 where sal_rank <= 10
9 /
ENAME SAL SAL_RANK
---------- ---------- ----------
1
SCHNEIDER 5000 2
FEUERSTEIN 4500 3
VERREYNNE 4000 4
LIRA 3750 5
PODER 3750 5
KESTELYN 3500 6
TRICHLER 3500 6
GASPAROTTO 3000 7
ROBERTSON 2990 8
RIGBY 2990 8
SPENCER 2850 9
BOEHMER 2450 10
13 rows selected.
SQL>
Run Code Online (Sandbox Code Playgroud)