如何在oracle中进行价值排序
我有表:tb_用户如何在oracle中进行价值排序,oracle,ranking,Oracle,Ranking,我有表:tb_用户 id|name|value 10|boy|500 20|Ony|200 10|boy|500 当我执行以下查询时: Select id,name,sum(value) as grant_total from tb_user group by id,name 结果是: id|name|grant_total 10|boy |1000 20|Ony |200 我想添加1列-->排名 id|name|grant_total|ranking 10|boy |1000
id|name|value
10|boy|500
20|Ony|200
10|boy|500
当我执行以下查询时:
Select id,name,sum(value) as grant_total from tb_user group by id,name
结果是:
id|name|grant_total
10|boy |1000
20|Ony |200
我想添加1列-->排名
id|name|grant_total|ranking
10|boy |1000 |1
20|Ony |200 |2
如何排名?试试:
Select id,name,sum(value) as grant_total, rownum as ranking from tb_user group by id,name
您可以使用ROWNUM和子查询对行进行第一次排序:
SQL> WITH DATA AS(
2 SELECT 10 ID, 'boy' NAME, 1000 grand_total FROM dual UNION ALL
3 SELECT 20, 'Ony', 200 grand_total from dual
4 )
5 SELECT t.*,
6 rownum ranking
7 FROM
8 ( SELECT * FROM DATA ORDER BY grand_total DESC
9 ) t
10 /
ID NAM GRAND_TOTAL RANKING
---------- --- ----------- ----------
10 boy 1000 1
20 Ony 200 2
SQL>
或者
您可以使用分析函数:
比如说,
SQL> WITH DATA AS(
2 SELECT 10 ID, 'boy' NAME, 1000 grand_total FROM dual UNION ALL
3 SELECT 20, 'Ony', 200 grand_total from dual
4 )
5 SELECT t.*, row_number() OVER(ORDER BY grand_total DESC) ranking FROM DATA t;
ID NAM GRAND_TOTAL RANKING
---------- --- ----------- ----------
10 boy 1000 1
20 Ony 200 2
SQL>
根据需要,您需要使用:
SQL> SELECT empno, ename, sal FROM emp;
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
7566 JONES 2975
7654 MARTIN 1250
7698 BLAKE 2850
7782 CLARK 2450
7788 SCOTT 3000
7839 KING 5000
7844 TURNER 1500
7876 ADAMS 1100
7900 JAMES 950
7902 FORD 3000
7934 MILLER 1300
14 rows selected.
SQL> SELECT empno,
2 ename,
3 sal,
4 ROW_NUMBER() OVER(ORDER BY sal) rnum,
5 RANK() OVER(ORDER BY sal DESC) rank,
6 DENSE_RANK() OVER(ORDER BY sal) drank
7 FROM emp
8 ORDER BY empno
9 /
EMPNO ENAME SAL RNUM RANK DRANK
---------- ---------- ---------- ---------- ---------- ----------
7369 SMITH 800 1 14 1
7499 ALLEN 1600 8 7 7
7521 WARD 1250 4 10 4
7566 JONES 2975 11 4 10
7654 MARTIN 1250 5 10 4
7698 BLAKE 2850 10 5 9
7782 CLARK 2450 9 6 8
7788 SCOTT 3000 12 2 11
7839 KING 5000 14 1 12
7844 TURNER 1500 7 8 6
7876 ADAMS 1100 3 12 3
7900 JAMES 950 2 13 2
7902 FORD 3000 13 2 11
7934 MILLER 1300 6 9 5
14 rows selected.
SQL>
最简单的方法是使用
ROW\u NUMBER()
分析函数(或者RANK()
如果您希望对关系进行平均排序):
如果在此处使用
ROWNUM
,您将得到一个错误:ORA-00979:不是一个分组表达式
SELECT id, name, SUM(value) AS grand_total
, ROW_NUMBER() OVER ( ORDER BY SUM(value) DESC ) AS ranking
FROM tb_user
GROUP BY id, name
ORDER BY ranking;