開窗函式和排名函式

2021-06-18 16:15:43 字數 2293 閱讀 9346

*開窗函式必須結合排名或者聚合函式一起使用

視窗是使用者指定的一組行。開窗函式計算從視窗派生的結果集中各行的值

1.開窗聚合函式

select *,sum(score) over() as 彙總,

convert(decimal(18,4),score/sum(score) over()) as 單個比例,

sum(score) over(partition by orderid) as 部門彙總,//按部門彙總

convert(decimal(18,4),score/sum(score) over(partition by orderid)) as 單個佔部門比例 from t

查詢結果:

id orderid score 彙總 單個比例 部門彙總 單個佔部門比例

1 1 2.00 27.20 0.0735 3.00 0.6667

2 1 1.00 27.20 0.0368 3.00 0.3333

3 2 6.00 27.20 0.2206 7.10 0.8451

4 2 1.10 27.20 0.0404 7.10 0.1549

5 3 8.00 27.20 0.2941 16.10 0.4969

6 3 1.10 27.20 0.0404 16.10 0.0683

7 3 7.00 27.20 0.2574 16.10 0.4348

8 4 1.00 27.20 0.0368 1.00 1.0000

2.開窗排名函式

select orderid,score,

rank() over(partition by orderid order by score) as 分組排名,

rank() over(order by score) as 排名

from ordertable

order by orderid asc

查詢結果:

id orderid score 分組排名 總排名

1 1 2.00 1 4

2 1 1.00 2 6

3 2 6.00 1 3

4 2 1.10 2 5

6 3 1.10 3 5

5 3 8.00 1 1

7 3 7.00 2 2

8 4 1.00 1 6

*排名函式

1.row_number

select row_number() over(order by score) as 行號,* from t

行號 id orderid score

1 2 1 1.00

2 8 4 1.00

3 6 3 1.10

4 4 2 1.10

5 1 1 2.00

6 3 2 6.00

7 7 3 7.00

8 5 3 8.00

2.rank //如果出現相同的值的情況

select rank() over(order by score) as 行號,* from t

1 2 1 1.00

1 8 4 1.00

3 6 3 1.10

3 4 2 1.10

5 1 1 2.00

6 3 2 6.00

7 7 3 7.00

8 5 3 8.00

3.dense_rank //也是出現相同的值的情況,這個是繼續往下排

select dense_rank() over(order by score) as 行號,* from t

1 2 1 1.00

1 8 4 1.00

2 6 3 1.10

2 4 2 1.10

3 1 1 2.00

4 3 2 6.00

5 7 3 7.00

6 5 3 8.00

4.ntile 函式可以對序號進行分組處理。這就相當於將查詢出來的記錄集放到指定長度的陣列中,每乙個陣列元素存放一定數量的記錄。ntile函式為每條記錄生成的序號就是這條記錄所有的陣列元素的索引(從1開始)。也可以將每乙個分配記錄的陣列元素稱為「桶」。ntile函式有乙個引數,用來指定桶數

select ntile(4) over(order by score) as 行號,* from t

1 2 1 1.00

1 8 4 1.00

2 6 3 1.10

2 4 2 1.10

3 1 1 2.00

3 3 2 6.00

4 7 3 7.00

4 5 3 8.00

Hive開窗函式和Rank函式

over 跟在聚合函式後面,指定分析函式工作的資料視窗大小,決定了資料的聚合範圍,預設範圍是整個資料視窗,即所有行。可使用partition by將資料進行分組聚合 使用order by除了排序 預設asc公升序 還會改變聚合範圍 從開始行到當前行的聚合 使用distribute by sort b...

rank 開窗函式 排序類開窗函式

1,row number over 排序,連續 select score,row number over from sc 按原始 的成績順序進行排序 原始 成績順序 先將分數從大到小排序,分數相同,排名不同 select score,row number over order by score fr...

oracle開窗函式

1.使用row number分頁,查詢第1 10條資料 select t.custid,t.companyname,t.address,t.city from select row number over order by custid as rownum,custid,companyname,ad...