【正文】
ROWNUM10。 DEPTNO SAL ENAME LAST_ENAME 10 1300 MILLER MILLER 10 2450 CLARK CLARK 10 5000 KING KING 20 800 SMITH SMITH 20 2975 JONES JONES 20 3000 FORD FORD 30 950 JAMES JAMES 30 1250 WARD WARD 30 1250 MARTIN MARTIN 30 1500 TURNER TURNER 30 1600 ALLEN ALLEN 30 2850 BLAKE BLAKE 聚集分析函數有 sum,max,min,avg,count等,很多組函數同時可以作為分析函數使用。%39。||39。 A B A 1 A 2 A 3 A 4 A 5 A 6 A 7 SQL set null null SQL SELECT a,b,LEAD(b) OVER(PARTITION BY a ORDER BY b) c, 2 LEAD(b,2) OVER(PARTITION BY a ORDER BY b) d, 3 LEAD(b,3) OVER(PARTITION BY a ORDER BY b) e, 4 LEAD(b,4) OVER(PARTITION BY a ORDER BY b) f 5 FROM tab。 ID PERSONS 1 3 2 2 平均分派問題,如何將金額平均分攤,并且小數也分攤掉,避免誤差。 INDEX_NAME COLUMN_NAME ALL_ORDERS_PK YEAR ALL_ORDERS_PK MONTH ALL_ORDERS_PK CUST_NBR ALL_ORDERS_PK REGION_ID ALL_ORDERS_PK SALESPERSON_ID ASSEMBLY_PK ASSEMBLY_TYPE ASSEMBLY_PK ASSEMBLY_ID A_ID_PK ID CUSTOMER_PK CUST_NBR select INDEX_NAME, max(decode(rn, 1, COLUMN_NAME)) c1, max(decode(rn, 2, COLUMN_NAME)) c2, max(decode(rn, 3, COLUMN_NAME)) c3, max(decode(rn, 4, COLUMN_NAME)) c4, max(decode(rn, 4, COLUMN_NAME)) c5 from (select INDEX_NAME, TABLE_NAME, COLUMN_NAME, row_number() over(partition by INDEX_NAME order by COLUMN_NAME) rn from user_ind_columns where INDEX_NAME like 39。 ID MIN(NUM) SUM(VAL) 1 1 300 1 5 250 2 1 100 2 3 400 3 1 300 將 num的值按 id相同的,按月升序,如果當前行為空,將前面最近非空的 num填充到當前行,否則找最近的后面行。 SELECT deptno,listagg(ename,39。無 window子句,分別得到當前行物理偏移 n行的值,默認偏移 1,比較特殊,這里沒有邏輯窗口的概念。 SELECT yy,mm,NAME,s_qty,avg_price, (SELECT FROM sale t WHERE = AND = AND = ) last_invent FROM ( SELECT yy,mm,NAME,SUM(qty) s_qty,AVG(price) avg_price,MAX(dd) mdd FROM sale GROUP BY yy,mm,NAME ) s ORDER BY yy,mm,NAMESELECT yy,mm,NAME,SUM(qty) s_qty,AVG(price) avg_price, MAX(invent) KEEP (dense_rank LAST ORDER BY dd) last_invent FROM sale GROUP BY yy,mm,NAME22 FIRST_VALUE/LAST_VALUE只能用作分析函數,它返回的是按照指定排序,得到對應窗口集合的第 1個值或最后一個值。 示例 說明 ROWS/RANGE UNBOUNDED PRECEDING 終點 CURRENT ROW,相當于 BETWEEN 起點 BTEWEEN CURRENT ROW ROWS/RANGE CURRENT ROW 相當于 BETWEEN CURRENT ROW AND CURRENT ROW ROWS/RANGE value_expr PRECEDING 相當于 BETWEEN value_expr PRECEDING AND CURRENT ROW value_expr FOLLOWING 報錯 ,無效窗口 表 1只指定起點的 表 2有起點和終點 示例 說明 ROWS/RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 和無 ORDER BY一樣,等價于沒有寫 ORDER By和WINDOW子句 ROWS/RANGE BETWEEN CURRENT ROW AND value_expr FOLLOWING 當前行到對應 value_exp偏移量的行 ROWS/RANGE BETWEEN value_expr FOLLOWING AND value_expr1 FOLLOWING 起點是 FOLLOWING,終點必須是 FOLLOWING ROWS/RANGE BETWEEN value_expr PRECEDING AND value_expr1 FOLLOWING 終點是 PRECEDING,起點必須是 PRECEDING ROWS/RANGE BETWEEN CURRENT ROW AND value_expr PRECEDING 報錯 ,無效窗口 17 分類 內容 說明 使用頻率 排名分析函數 ROW_NUMBER、 RANK、DENSE_RANK、 FIRST、 LAST、 LAST_VALUE,FIRST_VALUE FIRST,LAST不應該算做函數,它主要與聚合函數聯(lián)合使用 強 聚合分析函數 AVG、 COUNT、MAX,MIN,SUM 強 行比較分析函數 LEAD、 LAG 解決當前行與前后行之間的關系 中 統(tǒng)計分析函數 RATIO_TO_REPORT 解決報表占比問題 中 行連接分析函數 LISTAGG 11g新特性 中 其他分析函數 CORR、 CORVAR_POP、CORVAR_SAMP、 CUME_DIST、NTH_VALUE、 NTILE、PERCENT_RANK、PERCENTILE_CONT、PERCENTILE_DISC、 REGR_ (Linear Regression) Functions、STDDEV、 STDDEV_POP、STDDEV_SAMP 、 VAR_POP,VAR_SAMP、VARIANCE 弱 按照各種分析函數使用頻率以及業(yè)務特點,將分析函數分為排名分析函數、聚合分析函數、行比較分析函數、統(tǒng)計分析函數、行連接分析函數、其他分析函數( 基本都是數學統(tǒng)計函數,很少使用 )。 SELECT department_id, employee_id, salary, SUM(salary) over(PARTITION BY department_id ORDER BY salary RANGE BETWEEN 100 preceding AND 500 following) sum_sal FROM 。 1 2 3 ID DEFAULT_SUM RANGE_UNBOUND_SUM ROWS_UNBOUND_SUM RANGE_SUM ROWS_SUM 1 2 2 1 5 5 1 2 2 2 5 11 3 5 5 5 3 16 6 23 23 11 33 21 6 23 23 17 33 25 6 23 23 23 33 27 7 30 30 30 42 30 8 38 38 38 24 24 9 47 47 47 17 17 13 rows窗口是物理窗口,也就是排序后,按排序結果的行號對應確定窗口,指定rows窗口的話,必須要求排序鍵唯一,否則結果可能不穩(wěn)定。每個 分析函數都可以使用 partition by子句 。)) FROM demo2 WHERE owner=39。) DESC )=1) 4 access(OWNER=39。)) FROM DEMO2 DEMO2 WHERE OWNER=39。) SELECT owner,object_type FROM ( SELECT owner,object_type, dense_rank() over(ORDER BY trunc(created,39。 SELECT owner,object_type FROM demo2 WHERE owner=39。dd39。fmdd39。DINGJUN12339。dd39。DINGJUN12339。 order by如果有多個排序 鍵且是 range窗口, 則必須要求對應的窗口是當前 partition所有行、第 1行到當前行、當前行到當前 partition最后 一行或當前行到當前行 1 2 3 SELECT deptno, empno, sal, SUM(sal) over(PARTITION BY deptno ORDER BY sal) dept_current, SUM(sal) over(PARTITION BY deptno ORDER BY sal RANGE BETWEEN unbounded preceding AND CURRENT ROW) de