【SQL查詢】獲取分區里最大和最小值_first_value/last_value


FIRST_VALUE | LAST_VALUE

1. 語法

FIRST_VALUE | LAST_VALUE ( expression [ IGNORE NULLS | RESPECT NULLS ] ) OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list frame_clause ] )

2. 參數說明

【expression】:對其執行函數的目標列或表達式。

【IGNORE NULLS】:將此選項與 FIRST_VALUE 結合使用時,該函數返回不為 NULL 的框架中的第一個值(如果所有值為 NULL,則返回 NULL)。將此選項與 LAST_VALUE 結合使用時,該函數返回不為 NULL 的框架中的最后一個值(如果所有值為 NULL,則返回 NULL)。

【RESPECT NULLS】:指示 Amazon Redshift 應包含 null 值以確定要使用的行。如果您未指定 IGNORE NULLS,則默認情況下不支持 RESPECT NULLS。

【OVER】:引入函數的窗口子句。

【PARTITION BY expr_list】:依據一個或多個表達式定義函數的窗口。

【ORDER BY order_list】:對每個分區中的行進行排序。如果未指定 PARTITION BY 子句,則 ORDER BY 對整個表進行排序。如果指定 ORDER BY 子句,則還必須指定frame_clause

3.示例

  • 初始化腳本
/*創建表格(emp)*/
create table emp( EMPNO NUMBER(4) primary key, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) ); /*向表格中插入數據*/
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, to_date('1980-12-17','YYYY-MM-DD'), 800, NULL, 20); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('1981-02-20','YYYY-MM-DD'), 1600, 300, 30); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, to_date('1981-02-22','YYYY-MM-DD'), 1250, 500, 20); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, to_date('1981-04-02','YYYY-MM-DD'), 2975, NULL, 20); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('1981-09-28','YYYY-MM-DD'), 1250, 1400, 30); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, to_date('1981-05-01','YYYY-MM-DD'), 2845, NULL, 30); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, to_date('1981-06-09','YYYY-MM-DD'), 2450, NULL, 10); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, to_date('1987-04-19','YYYY-MM-DD'), 3000, NULL, 20); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', NULL, to_date('1981-11-17','YYYY-MM-DD'), 5000, NULL, 10); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, to_date('1981-09-08','YYYY-MM-DD'), 1500, 0, 30); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, to_date('1987-05-23','YYYY-MM-DD'), 1100, NULL, 20); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, to_date('1981-12-03','YYYY-MM-DD'), 950, NULL, 30); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566, to_date('1981-12-03','YYYY-MM-DD'), 3000, NULL, 20); insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, to_date('1982-01-23','YYYY-MM-DD'), 1300, NULL, 10); commit;
View Code

 

  • FIRST_VALUE: 獲取每個部門最高的工資
select emp.*, first_value(emp.sal) over(partition by emp.deptno order by emp.sal desc) "最高工資" from emp

結果:

 

 

  • LAST_VALUE:獲取每個部門最低工資
select emp.*, last_value(emp.sal) over(partition by emp.deptno order by emp.sal desc) "最低工資" from emp

結果:

  

 

  和預期的結果不一樣,系統未獲取分區中最小的工資。根本原因如下:last_value()默認統計范圍是:rows between unbounded preceding and current row, 而應該采用以下的統計范圍: rows between unbounded preceding and unbounded following(兩者統計范圍的差別,可參考注釋)。修改代碼如下:

select emp.*, last_value(emp.sal) over(partition by emp.deptno order by emp.sal desc  rows between unbounded preceding and unbounded following) "最低工資" from em

結果:

  

 

 注:

  unbounded:無界限

preceding:從分區第一行頭開始,則為 unbounded。 N為:相對當前行向前的偏移量

following :與preceding相反,到該分區結束,則為 unbounded。N為:相對當前行向后的偏移量

current row:顧名思義,當前行,偏移量為0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM