日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 排序的分析函数,oracle下数据的排序分组row_number() over()--分析函数,可用于去重...

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 排序的分析函数,oracle下数据的排序分组row_number() over()--分析函数,可用于去重... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)。

與rownum的區別在于:使用rownum進行排序的時候是先對結果集加入偽劣rownum然后再進行排序,而此函數在包含排序從句后是先排序再計算行號碼。

與此功能相似的函數還有:rank/dense_rank/ntile

row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開始排序)。

rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內)

dense_rank()也是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重復值的

oracle 分析函數 row_number(),返回一個整數值(>=1)

測試表/數據

CREATE TABLE test_course (

student_name ?VARCHAR(10), ?-- 學生

course_name ? VARCHAR(10), ?-- 課程

grade ? ? ? ? INT ? ? ? ? ? -- 成績

);

INSERT INTO test_course VALUES('甲', '語文', 95);

INSERT INTO test_course VALUES('乙', '語文', 85);

INSERT INTO test_course VALUES('丙', '語文', 75);

INSERT INTO test_course VALUES('丁', '語文', 65);

INSERT INTO test_course VALUES('戊', '語文', 55);

INSERT INTO test_course VALUES('己', '語文', 50);

INSERT INTO test_course VALUES('庚', '語文', 60);

INSERT INTO test_course VALUES('辛', '語文', 70);

INSERT INTO test_course VALUES('壬', '語文', 80);

INSERT INTO test_course VALUES('奎', '語文', 90);

INSERT INTO test_course VALUES('甲', '數學', 90);

INSERT INTO test_course VALUES('乙', '數學', 80);

INSERT INTO test_course VALUES('丙', '數學', 70);

INSERT INTO test_course VALUES('丁', '數學', 60);

INSERT INTO test_course VALUES('戊', '數學', 50);

INSERT INTO test_course VALUES('己', '數學', 50);

INSERT INTO test_course VALUES('庚', '數學', 60);

INSERT INTO test_course VALUES('辛', '數學', 70);

INSERT INTO test_course VALUES('壬', '數學', 85);

INSERT INTO test_course VALUES('奎', '數學', 95);

ROW_NUMBER 順序編號

按照分數 編號 從高到底

SELECT

ROW_NUMBER() OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

2 奎 185

3 壬 165

4 乙 165

5 丙 145

6 辛 140

7 丁 125

8 庚 120

9 戊 105

10 己 100

按照分數 編號 從高到底(區分 課程)

SELECT

ROW_NUMBER() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,

*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 數學 95

2 甲 數學 90

3 壬 數學 85

4 乙 數學 80

5 丙 數學 70

6 辛 數學 70

7 庚 數學 60

8 丁 數學 60

9 戊 數學 50

10 己 數學 50

1 甲 語文 95

2 奎 語文 90

3 乙 語文 85

4 壬 語文 80

5 丙 語文 75

6 辛 語文 70

7 丁 語文 65

8 庚 語文 60

9 戊 語文 55

10 己 語文 50

RANK 排名不連續

按照分數 排名 從高到底

SELECT

RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

1 奎 185

3 壬 165

3 乙 165

5 丙 145

6 辛 140

7 丁 125

8 庚 120

9 戊 105

10 己 100

按照分數 排名 從高到底(區分 課程)

SELECT

RANK() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,

*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 數學 95

2 甲 數學 90

3 壬 數學 85

4 乙 數學 80

5 丙 數學 70

5 辛 數學 70

7 庚 數學 60

7 丁 數學 60

9 戊 數學 50

9 己 數學 50

1 甲 語文 95

2 奎 語文 90

3 乙 語文 85

4 壬 語文 80

5 丙 語文 75

6 辛 語文 70

7 丁 語文 65

8 庚 語文 60

9 戊 語文 55

10 己 語文 50

DENSE_RANK 排名連續

按照分數 排名 從高到底

SELECT

DENSE_RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

1 奎 185

2 壬 165

2 乙 165

3 丙 145

4 辛 140

5 丁 125

6 庚 120

7 戊 105

8 己 100

按照分數 排名 從高到底(區分 課程)

SELECT

DENSE_RANK() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 數學 95

2 甲 數學 90

3 壬 數學 85

4 乙 數學 80

5 丙 數學 70

5 辛 數學 70

6 庚 數學 60

6 丁 數學 60

7 戊 數學 50

7 己 數學 50

1 甲 語文 95

2 奎 語文 90

3 乙 語文 85

4 壬 語文 80

5 丙 語文 75

6 辛 語文 70

7 丁 語文 65

8 庚 語文 60

9 戊 語文 55

10 己 語文 50

NTILE 分組

按照分數 劃分5個區間 從高到底

SELECT

NTILE(5) OVER( ORDER BY SUM(grade) DESC) AS NO,

student_name,

SUM(grade) AS AllGrade

FROM

test_course

GROUP BY

student_name

ORDER BY

SUM(grade) DESC

1 甲 185

1 奎 185

2 壬 165

2 乙 165

3 丙 145

3 辛 140

4 丁 125

4 庚 120

5 戊 105

5 己 100

按照分數 劃分區間 從高到底(區分 課程)

SELECT

NTILE(5) OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,

*

FROM

test_course

ORDER BY

course_name,

grade DESC

1 奎 數學 95

1 甲 數學 90

2 壬 數學 85

2 乙 數學 80

3 丙 數學 70

3 辛 數學 70

4 庚 數學 60

4 丁 數學 60

5 戊 數學 50

5 己 數學 50

1 甲 語文 95

1 奎 語文 90

2 乙 語文 85

2 壬 語文 80

3 丙 語文 75

3 辛 語文 70

4 丁 語文 65

4 庚 語文 60

5 戊 語文 55

5 己 語文 50

使用分析函數來進行去重的例子:

product

loid

time

aaa

AAABBBCCC

2013-4-5

aaa

CCC55SSADD

2013-4-13

bbb

FFFF223SSSA

2013-8-8

bbb

GSAAASSFBB

2013-8-1

數據結構如上圖,其中第1列有重復,第2列唯一,第3列為時間,有大小唯一。需求:一個product只能有一個loid,現需要根據時間大小,保留最后一次增加的數據,將時間小的product刪除。最后得到結果如下:

product

loid

time

aaa

CCC55SSADD

2013-4-13

bbb

FFFF223SSSA

2013-8-8

思路:根據product來進行分組編號,通過時間大小來排序。篩選出時間最大的loid,再根據loid將product重復的刪除)

select row_number() over(partition by product order by time desc) as no,product,loid,time from test; ? ?--通過分析函數進行分組編號

select loid from (select row_number() over(partition by product order by time desc) as no,product,loid,time from test) where no=1; ?---得出滿足條件的loid,因為為降序,所以不管product重復的有幾個,編號為1的始終為分組內時間最大的

delete from test where loid not in (select loid from (select row_number() over(partition by product order by time desc) as no,product,loid,time from test) where no=1); ? ?--根據得出的滿足條件的loid來進行篩選刪除。

此為通過分析函數來去重的例子,其他重復數據的查找與刪除,可通過rowid或分組來進行。

總結

以上是生活随笔為你收集整理的oracle 排序的分析函数,oracle下数据的排序分组row_number() over()--分析函数,可用于去重...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。