锘??xml version="1.0" encoding="utf-8" standalone="yes"?> create view V (id,amt,trx) as select 1, 100, 'PR' from t1 union all select 2, 100, 'PR' from t1 union all select 3, 50, 'PY' from t1 union all select 4, 100, 'PR' from t1 union all select 5, 200, 'PY' from t1 union all select 6, 50, 'PY' from t1 select * from V ID AMT TR -- ---------- -- 1 100 PR 2 100 PR 3 50 PY 4 100 PR 5 200 PY 6 50 PY ID鍒楀敮涓鏍囪瘑姣忔浜嬪姟澶勭悊銆侫MT鍒楄〃紺烘瘡嬈′簨鍔″鐞嗭紙鍙栨鎴栧瓨嬈撅級娑夊強鐨勯噾棰濄俆RX鍒楀畾涔変簡浜嬪姟澶勭悊鐨勭被鍨嬶紱鍙栨鏄?#8220;PY”錛屽瓨嬈炬槸“PR”銆傚鏋淭RX鍊兼槸PY錛屽垯鎯寵浠庣瘡璁″拰涓噺鍘籄MT鍊間唬琛ㄧ殑閲戦錛涘鏋淭RX鍊兼槸PR錛屽垯鎯寵緇欑瘡璁″拰鍔犱笂AMT鍊間唬琛ㄧ殑閲戦銆傛渶鍚庡簲璇ヨ繑鍥炲涓嬬粨鏋滈泦錛?/p>
TRX_TYPE AMT BALANCE -------- ---------- ---------- PURCHASE 100 100 PURCHASE 100 200 PAYMENT 50 150 PURCHASE 100 250 PAYMENT 200 50 PAYMENT 50 0 瑙e喅鏂規 DB2鍜孫racle 浣跨敤紿楀彛鍑芥暟SUM OVER鍒涘緩绱鍜岋紝騫朵嬌鐢–ASE琛ㄨ揪寮忓垽鏂簨鍔″鐞嗙殑綾誨瀷錛?/p>
1 select case when trx = 'PY' 2 then 'PAYMENT' 3 else 'PURCHASE' 4 end trx_type, 5 amt, 6 sum( 7 case when trx = 'PY' 8 then -amt else amt 9 end 10 ) over (order by id,amt) as balance 11 from V MySQL銆丳ostgreSQL鍜孲QL Server 浣跨敤鏍囬噺瀛愭煡璇㈠垱寤虹瘡璁″拰錛屽茍浣跨敤CASE琛ㄨ揪寮忓垽鏂簨鍔″鐞嗙殑綾誨瀷錛?/p>
1 select case when v1.trx = 'PY' 2 then 'PAYMENT' 3 else 'PURCHASE' 4 end as trx_type, 5 v1.amt, 6 (select sum( 7 case when v2.trx = 'PY' 8 then -v2.amt else v2.amt 9 end 10 ) 11 from V v2 12 where v2.id <= v1.id) as balance 13 from V v1 璁ㄨ CASE琛ㄨ揪寮忓垽鏂槸璇ョ粰绱鍜屽姞涓婂綋鍓嶇殑AMT鍊艱繕鏄粠涓噺鍘誨綋鍓嶇殑AMT鍊?銆傚鏋滀簨鍔″鐞嗘槸鍙栨錛屽垯鎶夾MT鏇存敼涓鴻礋鍊鹼紝榪欐牱灝卞噺灝戜簡绱鍜屻侰ASE琛ㄨ揪寮忕殑緇撴灉濡備笅鎵紺猴細 select case when trx = 'PY' then 'PAYMENT' else 'PURCHASE' end trx_type, case when trx = 'PY' then -amt else amt end as amt from V TRX_TYPE AMT -------- --------- PURCHASE 100 PURCHASE 100 PAYMENT -50 PURCHASE 100 PAYMENT -200 PAYMENT -50 鍦ㄧ‘瀹氫簡浜嬪姟澶勭悊綾誨瀷涔嬪悗錛屽氨鍙互浠庣瘡璁″拰涓姞涓婃垨鑰呭噺鍘籄MT鍊箋傛湁鍏崇獥鍙e嚱鏁癝UM OVER鎴栨爣閲忓瓙鏌ヨ濡備綍鍒涘緩绱鍜岀殑璇存槑錛岃鍙傞槄“璁$畻绱鍜?#8221;銆?/p>
瑙e喅鏂規 DB2 浣跨敤鍑芥暟TRANSLATE鍜孯EPLACE錛屼粠瀛楁瘝鏁板瓧涓蹭腑鎻愬彇鏁板瓧瀛楃錛?/p>
1 select cast( 2 replace( 3 translate( 'paul123f321', 4 repeat('#',26), 5 'abcdefghijklmnopqrstuvwxyz'),'#','') 6 as integer ) as num 7 from t1 Oracle鍜孭ostgreSQL 浣跨敤鍑芥暟TRANSLATE鍜孯EPLACE錛屽彲浠ヤ粠鍖呭惈瀛楁瘝鏁板瓧鐨勫瓧絎︿覆涓彁鍙栨暟瀛楀瓧絎︼細 1 select cast( 2 replace( 3 translate( 'paul123f321', 4 'abcdefghijklmnopqrstuvwxyz', 5 rpad('#',26,'#')),'#','') 6 as integer ) as num 7 from t1 MySQL鍜孲QL Server 鍒版湰涔︾紪鍐欐椂涓烘錛岃繖涓や釜渚涘簲鍟嗛兘涓嶆敮鎸乀RANSLATE鍑芥暟錛屽洜姝よ繖閲屼笉鑳界粰鍑鴻В鍐蟲柟妗堜簡銆?/p>
璁ㄨ 涓ょ瑙e喅鏂規鐨勫敮涓宸埆鏄娉曪紝DB2浣跨敤鍑芥暟REPEAT浠f浛RPAD錛岃屼笖TRANSLATE鍙傛暟鍒楄〃鐨勯『搴忎篃涓嶅悓銆備互涓嬬殑瑙i噴閲囩敤浜哋racle/PostgreSQL瑙e喅鏂規錛?DB2涔熺被浼箋傚鏋滀粠閲屽悜澶栬繍琛岃鏌ヨ錛堜粎浠呬粠TRANSLATE寮濮嬶級錛屽氨浼氬彂鐜拌繖闈炲父綆鍗曘傞鍏堬紝TRANSLATE鎶婇潪鏁板瓧瀛楃杞崲涓?#8220;#”錛?/p>
select translate( 'paul123f321', 'abcdefghijklmnopqrstuvwxyz', rpad('#',26,'#')) as num from t1 NUM ----------- ####123#321 鐢變簬鐜板湪鎵鏈夐潪鏁板瓧瀛楃閮界敤“#”琛ㄧず浜嗭紝鍥犳鍙渶浣跨敤REPLACE鍘繪帀瀹冧滑錛岀劧鍚庢妸緇撴灉杞崲涓烘暟鍊箋傝繖涓壒孌婄殑渚嬪瓙灝ゅ叾綆鍗曪紝鍥犱負瀛楃涓蹭腑鍙湁瀛楁瘝鍜屾暟瀛椼傚鏋滆繕鏈夊叾浠栧瓧絎︼紝閭d箞鐢ㄥ彟涓縐嶆柟娉曚細鏇村鏄擄細涓嶆槸鎵懼嚭闈炴暟瀛楀瓧絎﹀茍鍘繪帀瀹冧滑錛岃屾槸鎵懼嚭鎵鏈夋暟瀛楀瓧絎︼紝騫跺幓鎺変笉灞炰簬榪欎簺瀛楃鑼冨洿鐨勫叾浠栧瓧絎︺備笅闈㈢殑渚嬪瓙浼氭湁鍔╀簬鐞嗚В榪欑鎶宸э細 select replace( translate('paul123f321', replace(translate( 'paul123f321', '0123456789', rpad('#',10,'#')),'#',''), rpad('#',length('paul123f321'),'#')),'#','') as num from t1 NUM ------ 123321 杈冧箣鍘熷鏂規錛岃瑙e喅鏂規鐪嬭搗鏉ユ湁鐐瑰効璐硅В錛屼絾濡傛灉鎶婂畠鍒嗚В寮鏉ュ氨瀹規槗鐞嗚В浜嗐傝瀵熶竴涓嬫渶鍐呭眰鐨凾RANSLATE璋冪敤錛? select translate( 'paul123f321', '0123456789', rpad('#',10,'#')) from t1 TRANSLATE(' ----------- paul###f### 涓庡師鏉ユ柟妗堜笉鍚岀殑鏄紝瀹冩病鏈夌敤“#”瀛楃鏇挎崲姣忎釜闈炴暟瀛楀瓧絎︼紝鑰屾槸鐢?#8220;#”瀛楃鏇挎崲鎵鏈夋暟瀛楀瓧絎︺傛帴涓嬫潵錛屽幓鎺夋墍鏈?#8220;#”錛岃繖鏍鳳紝鍙墿涓嬮潪鏁板瓧瀛楃錛?/p>
select replace(translate( 'paul123f321', '0123456789', rpad('#',10,'#')),'#','') from t1 REPLA ----- paulf 涓嬩竴姝ワ紝鍐嶆璋冪敤TRANSLATE錛岃繖嬈$敤“#”瀛楃鏇挎崲鍘熷瀛楃涓蹭腑鐨勬墍鏈夐潪鏁板瓧瀛楃錛堝墠闈㈡煡璇㈢殑緇撴灉錛夛細 select translate('paul123f321', replace(translate( 'paul123f321', '0123456789', rpad('#',10,'#')),'#',''), rpad('#',length('paul123f321'),'#')) from t1 TRANSLATE(' ----------- ####123#321 鍒拌繖閲屽仠涓鍋滐紝媯楠屼竴涓嬫渶澶栧眰鐨凾RANSLATE璋冪敤銆俁PAD鐨勭浜屼釜鍙傛暟錛圖B2涓璕EPEAT鐨勭浜屼釜鍙傛暟錛夋槸鍘熷瀛楃涓茬殑闀垮害銆傝繖鏍峰仛寰堟柟渚匡紝鍥犱負鏄病鏈変換浣曞瓧絎﹀嚭鐜扮殑嬈℃暟浼氭瘮瀹冩墍鍦ㄧ殑鏁翠釜瀛楃涓查暱銆傜幇鍦紝鐢?#8220;#”瀛楃鏇挎崲鎵鏈夐潪鏁板瓧瀛楃錛涙渶鍚庝竴姝ワ紝浣跨敤REPLACE鍘繪帀鎵鏈?#8220;#”銆傝嚦姝わ紝浠呭墿涓嬫暟瀛椼?/p>
瑙e喅鏂規 MySQL鍜孭ostgreSQL 浣跨敤瀛愭煡璇㈡帓闄ゆ渶楂樺拰鏈浣庡鹼細 1 select avg(sal) 2 from emp 3 where sal not in ( 4 (select min(sal) from emp), 5 (select max(sal) from emp) 6 ) DB2銆丱racle鍜孲QL Server 浣跨敤鍐呰仈瑙嗗浘鍙婄獥鍙e嚱鏁癕AX OVER鍜孧IN OVER錛岀敓鎴愪竴涓粨鏋滈泦錛屽彲浠ュ緢瀹規槗鍦頒粠涓墧闄ゆ渶澶у拰鏈灝忓鹼細 1 select avg(sal) 2 from ( 3 select sal, min(sal)over() min_sal, max(sal)over() max_sal 4 from emp 5 ) x 6 where sal not in (min_sal,max_sal) 璁ㄨ MySQL鍜孭ostgreSQL 瀛愭煡璇㈣繑鍥炶〃涓殑鏈楂樺伐璧勫拰鏈浣庡伐璧勩傞拡瀵硅繑鍥炵殑鍊間嬌鐢∟OT IN錛屽氨鍙互浠庡鉤鍧囧間腑鎺掗櫎鏈楂樺伐璧勫拰鏈浣庡伐璧勩傝浣忥紝濡傛灉瀛樺湪閲嶅錛堝涓亴鍛橀兘鏄渶楂樻垨鏈浣庡伐璧勶級錛岄偅涔堜粬浠兘浼氳鎺掗櫎鍦ㄥ鉤鍧囧間箣澶栥傚鏋滃彧鎯蟲帓闄や竴涓渶楂樺拰鏈浣庡鹼紝鍙渶浠嶴UM涓噺鍘誨畠浠紝鍐嶅仛闄ゆ硶錛?/p>
select (sum(sal)-min(sal)-max(sal))/(count(*)-2) from emp DB2銆丱racle鍜孲QL Server 鍐呰仈瑙嗗浘X灝嗚繑鍥炴墍鏈夊伐璧勶紝鍏朵腑鍖呮嫭鏈楂樺伐璧勫拰鏈浣庡伐璧勶細 select sal, min(sal)over() min_sal, max(sal)over() max_sal from emp SAL MIN_SAL MAX_SAL --------- --------- --------- 800 800 5000 1600 800 5000 1250 800 5000 2975 800 5000 1250 800 5000 2850 800 5000 2450 800 5000 3000 800 5000 5000 800 5000 1500 800 5000 1100 800 5000 950 800 5000 3000 800 5000 1300 800 5000 浠庢瘡涓琛岄兘鍙互璁塊棶鏈楂樺伐璧勫拰鏈浣庡伐璧勶紝鍥犳錛岃鎵懼嚭鍝簺宸ヨ祫鏄渶楂樺伐璧勭殑鍜?鎴栨渶浣庡伐璧勭殑闈炲父綆鍗曘傚灞傛煡璇細瀵瑰唴鑱旇鍥綳榪斿洖鐨勮浣滅瓫閫夛紝榪欐牱錛屾墍鏈変笌MIN_SAL鍜孧AX_SALAN鐩稿尮閰嶇殑琛岄兘浼氫粠騫沖潎鍊間腑鎺掗櫎鎺夈?/p>
瑙e喅鏂規 浣跨敤COALESCE鍑芥暟鎶奛ULL杞崲涓?錛岃繖鏍峰湪榪涜鑱氶泦鏃跺彲浠ユ妸瀹冧滑鍖呮嫭榪涙潵錛?/p>
1 select avg(coalesce(comm,0)) as avg_comm 2 from emp 3 where deptno=30 璁ㄨ 璇峰姟蹇呰浣忥紝鍦ㄤ嬌鐢ㄨ仛闆嗗嚱鏁版椂浼氬拷鐣ULL銆備笉浣跨敤COALESCE鍑芥暟鏃惰瑙e喅鏂規鐨勮緭鍑哄涓嬶細 select avg(comm) from emp where deptno=30 AVG(COMM) --------- 550 璇ユ煡璇㈣〃鏄庯紝DEPTNO 30鐨勫鉤鍧囦劍閲戞槸550錛屽揩閫熸鏌ヨ繖浜涜濡備笅錛?/p>
select ename, comm from emp where deptno=30 order by comm desc ENAME COMM ---------- --------- BLAKE JAMES MARTIN 1400 WARD 500 ALLEN 300 TURNER 0 榪欒〃鏄庡叚涓亴鍛樹腑鍙湁鍥涗釜鑱屽憳鎸e緱浣i噾銆侱EPTNO 30涓墍鏈変劍閲戠殑鎬誨拰鏄?200錛屽叾騫沖潎鍊煎簲璇ユ槸2200/6錛岃屼笉鏄?200/4銆傚鏋滀笉鐢–OALESCE鍑芥暟錛屽洖絳旂殑鏄棶棰?#8220;DEPTNO 30涓專寰椾劍閲戠殑鑱屽憳鐨勫鉤鍧囦劍閲戞槸澶氬皯錛?#8221;錛岃屼笉鏄?#8220;DEPTNO 30涓墍鏈夎亴鍛樼殑騫沖潎浣i噾鏄灝戯紵”銆備嬌鐢ㄨ仛闆嗘椂璁頒綇瑕佺浉搴斿鐞哊ULL鍊箋?/p>
瑙e喅鏂規 鎬葷殑鏉ヨ錛屽湪SQL涓綆楀崰鎬繪暟鐨勭櫨鍒嗘瘮璺熶功闈㈣綆椾竴鏍鳳細鍏堥櫎鍚庝箻銆傝繖涓緥瀛愯璁$畻琛‥MP涓璂EPTNO 10宸ヨ祫鎵鍗犵殑鐧懼垎姣斻傞鍏堬紝綆楀嚭DEPTNO 10鐨勫伐璧勶紝鐒跺悗闄や互琛ㄤ腑鐨勫伐璧勬誨拰錛屾渶鍚庝竴姝ワ紝涔樹互100錛屽垯榪斿洖涓涓〃紺虹櫨鍒嗘瘮鐨勫箋?/p>
MySQL鍜孭ostgreSQL DEPTNO 10鐨勫伐璧勬誨拰闄や互鎵鏈夊伐璧勬誨拰錛?/p>
1 select (sum( 2 case when deptno = 10 then sal end)/sum(sal) 3 )*100 as pct 4 from emp DB2銆丱racle鍜孲QL Server 浣跨敤鍐呰仈瑙嗗浘鍙婄獥鍙e嚱鏁癝UM OVER錛岃綆楀嚭鎵鏈夊伐璧勬誨拰浠ュ強DEPTNO 10鐨勫伐璧勫拰銆傜劧鍚庯紝鍦ㄥ灞傛煡璇腑榪涜闄ゆ硶鍜屼箻娉曟搷浣滐細 1 select distinct (d10/total)*100 as pct 2 from ( 3 select deptno, 4 sum(sal)over() total, 5 sum(sal)over(partition by deptno) d10 6 from emp 7 ) x 8 where deptno=10 璁ㄨ MySQL鍜孭ostgreSQL 鐢–ASE璇彞鑳藉杞繪澗鍦板緱鍒癉EPTNO 10鐨勫伐璧勩傜劧鍚庡皢瀹冧滑鍔犺搗鏉ワ紝騫墮櫎浠ユ墍鏈夊伐璧勬誨拰銆傜敱浜庤仛闆嗘椂浼氬拷鐣ULL鍊鹼紝鎵浠ASE璇彞涓笉蹇呭姞鍏LSE瀛愬彞銆傚鏋滄兂鐪嬪埌紜垏鐨勮闄ゆ暟鍜岄櫎鏁幫紝鍒欏彲浠ユ墽琛屼笉鍋氶櫎娉曠殑鏌ヨ錛?/p>
select sum(case when deptno = 10 then sal end) as d10, sum(sal) from emp D10 SUM(SAL) ---- --------- 8750 29025 渚濆畾涔塖AL鐨勬柟寮忎笉鍚岋紝鍦ㄨ繘琛岄櫎娉曟搷浣滄椂鍙兘闇瑕佸仛鏄懼紡綾誨瀷杞崲銆備緥濡傦紝鍦―B2銆丼QL Server鍜孭ostgreSQL涓紝濡傛灉SAL瀹氫箟涓烘暣鏁幫紝鍒欏彲浠ユ妸瀹冭漿鎹負灝忔暟錛屼互渚垮緱鍒版紜瓟妗堬紝濡備笅鎵紺猴細 select (cast( sum(case when deptno = 10 then sal end) as decimal)/sum(sal) )*100 as pct from emp DB2銆丱racle鍜孲QL Server 闄や紶緇熻В鍐蟲柟妗堝錛岃鏂規浣跨敤紿楀彛鍑芥暟璁$畻鐩稿浜庢繪暟鐨勭櫨鍒嗘暟銆傚浜嶥B2鍜孲QL Server錛屽鏋淪AL瀹氫箟涓烘暣鏁扮被鍨嬶紝鍒欏湪闄ゆ硶鎿嶄綔涔嬪墠錛岄渶瑕佽繘琛岀被鍨嬭漿鎹細 select distinct cast(d10 as decimal)/total*100 as pct from ( select deptno, sum(sal)over() total, sum(sal)over(partition by deptno) d10 from emp ) x where deptno=10 蹇呴』璁頒綇錛岀獥鍙e嚱鏁板湪WHERE瀛愬彞鍚庢墽琛屻傚洜姝や笉鑳芥妸閽堝DEPTNO鐨勭瓫閫夋斁鍦ㄥ唴鑱旇鍥綳涓傚垎鍒冭檻涓涓嬪唴鑱旇鍥綳涓寘鍚強涓嶅寘鍚獶EPTNO絳涢夌殑緇撴灉銆傞鍏堬紝鐪嬩竴涓嬩笉鍖呭惈DEPTNO絳涢夌殑緇撴灉錛?/p>
select deptno, sum(sal)over() total, sum(sal)over(partition by deptno) d10 from emp DEP ------- --------- --------- 10 29025 8750 10 29025 8750 10 29025 8750 20 29025 10875 20 29025 10875 20 29025 10875 20 29025 10875 20 29025 10875 30 29025 9400 30 29025 9400 30 29025 9400 30 29025 9400 30 29025 9400 30 29025 9400 鍖呭惈DEPTNO絳涢夌殑緇撴灉錛?/p>
select deptno, sum(sal)over() total, sum(sal)over(partition by deptno) d10 from emp where deptno=10 DEPTNO TOTAL D10 ------ --------- --------- 10 8750 8750 10 8750 8750 10 8750 8750 鐢變簬紿楀彛鍑芥暟鍦╓HERE瀛愬彞鍚庢墽琛岋紝鍥犳TOTAL鐨勫間粎琛ㄧずDEPTNO 10鐨勫伐璧勪箣鍜岋紝鑰屽疄闄呬笂闇瑕佺敤TOTAL琛ㄧず鎵鏈夊伐璧勭殑鎬誨拰銆傝繖灝辨槸蹇呴』鎶婇拡瀵笵EPTNO鐨勭瓫閫夋斁鍦ㄥ唴鑱旇鍥綳澶栭潰鐨勫師鍥犮?/p>
select sal from emp where deptno = 20 order by sal SAL ---------- 800 1100 2975 3000 3000 涓棿鏁頒負2975銆?/p>
瑙e喅鏂規 闄や簡Oracle瑙e喅鏂規錛堢敤鍑芥暟璁$畻涓棿鏁幫級涔嬪錛屽叾浠栨墍鏈夎В鍐蟲柟妗堥兘鏄互Rozenshtein銆丄bramovich鍜孊irger鍦∣ptimizing Transact-SQL: Advanced Programming Techniques (SQL Forum Press, 1997)涓弿榪扮殑鏂規硶涓哄熀紜鐨勩備笌浼犵粺鐨勮嚜鑱旀帴鐩告瘮錛岀獥鍙e嚱鏁扮殑寮曞叆錛屼嬌瑙e喅鏂規鏇翠負鏈夋晥銆?/p>
DB2 浣跨敤紿楀彛鍑芥暟COUNT(*) OVER鍜孯OW_NUMBER錛屾煡鎵句腑闂存暟錛?/p>
1 select avg(sal) 2 from ( 3 select sal, 4 count(*) over() total, 5 cast(count(*) over() as decimal)/2 mid, 6 ceil(cast(count(*) over() as decimal)/2) next, 7 row_number() over (order by sal) rn 8 from emp 9 where deptno = 20 10 ) x 11 where ( mod(total,2) = 0 12 and rn in ( mid, mid+1 ) 13 ) 14 or ( mod(total,2) = 1 15 and rn = next 16 ) MySQL鍜孭ostgreSQL 浣跨敤鑷仈鎺ユ煡鎵句腑闂存暟錛?/p>
1 select avg(sal) 2 from ( 3 select e.sal 4 from emp e, emp d 5 where e.deptno = d.deptno 6 and e.deptno = 20 7 group by e.sal 8 having sum(case when e.sal = d.sal then 1 else 0 end) 9 >= abs(sum(sign(e.sal - d.sal))) 10 ) Oracle 浣跨敤鍑芥暟MEDIAN錛圤racle Database 10g錛夋垨PERCENTILE_CONT錛圤racle9i Database錛夛細 1 select median (sal) 2 from emp 3 where deptno=20 1 select percentile_cont(0.5) 2 within group(order by sal) 3 from emp 4 where deptno=20 瀵逛簬Oracle8i Database錛屼嬌鐢―B2瑙e喅鏂規銆傚浜嶰racle8i Database涔嬪墠鐨勭増鏈紝鍙互閲囩敤PostgreSQL/MySQL瑙e喅鏂規銆?/p>
SQL Server 浣跨敤紿楀彛鍑芥暟COUNT(*) OVER鍜孯OW_NUMBER錛屽彲寰楀埌涓棿鏁幫細 1 select avg(sal) 2 from ( 3 select sal, 4 count(*)over() total, 5 cast(count(*)over() as decimal)/2 mid, 6 ceiling(cast(count(*)over() as decimal)/2) next, 7 row_number()over(order by sal) rn 8 from emp 9 where deptno = 20 10 ) x 11 where ( total%2 = 0 12 and rn in ( mid, mid+1 ) 13 ) 14 or ( total%2 = 1 15 and rn = next 16 ) 璁ㄨ DB2鍜孲QL Server DB2鍜孲QL Server 瑙e喅鏂規鐨勫敮涓宸埆鏄娉曠殑紼嶈涓嶅悓錛歋QL Server鐢?#8220;%”姹傛ā錛岃孌B2浣跨敤MOD鍑芥暟錛涘叾浣欑殑閮界浉鍚屻傚唴鑱旇鍥綳榪斿洖涓変釜涓嶅悓鐨勮鏁板鹼紝TOTAL銆丮ID鍜孨EXT錛岃繕鐢ㄥ埌鐢盧OW_NUMBER鐢熸垚鐨凴N銆傝繖浜涢檮鍔犲垪鏈夊姪浜庢眰瑙d腑闂存暟銆傛楠屽唴鑱旇鍥綳鐨勭粨鏋滈泦錛屽氨浼氱湅鍒拌繖浜涘垪琛ㄧず鐨勬剰涔夛細 select sal, count(*)over() total, cast(count(*)over() as decimal)/2 mid, ceil(cast(count(*)over() as decimal)/2) next, row_number()over(order by sal) rn from emp where deptno = 20 SAL TOTAL MID NEXT RN ---- ----- ---- ---- ---- 800 5 2.5 3 1 1100 5 2.5 3 2 2975 5 2.5 3 3 3000 5 2.5 3 4 3000 5 2.5 3 5 瑕佸緱鍒頒腑闂存暟錛屼竴瀹氳鎶奡AL鍊肩敱浣庡埌楂樻帓搴忋傜敱浜嶥EPTNO 20涓殑鑱屽憳鏁版槸濂囨暟錛屽洜姝ゅ畠鐨勪腑闂存暟灝辨槸鍏禦N涓嶯EXT鐩哥瓑鐨凷AL錛堝嵆澶т簬鑱屽憳鎬繪暟闄や互2鐨勬渶灝忔暣鏁幫級銆?/p>
濡傛灉緇撴灉闆嗚繑鍥炲鏁拌錛學HERE瀛愬彞鐨勭涓閮ㄥ垎錛堢11锝?3琛岋級鏉′歡涓嶆弧瓚熾傚鏋滆兘澶熺‘瀹氱粨鏋滈泦鏄鏁拌錛屽垯鍙互綆鍖栦負錛?/p>
select avg(sal) from ( select sal, count(*)over() total, ceil(cast(count(*)over() as decimal)/2) next, row_number()over(order by sal) rn from emp where deptno = 20 ) x where rn = next 浠や漢閬楁喚鐨勬槸錛屽鏋滅粨鏋滈泦鍖呭惈鍋舵暟琛岋紝涓婅堪綆鍖栫殑瑙e喅鏂規灝辮涓嶉氥傚湪鏈鍒濈殑瑙e喅鏂規涓紝閲囩敤MID鍒椾腑鐨勫煎鐞嗗伓鏁拌銆傛兂鎯矰EPTNO 30鐨勫唴鑱旇鍥綳鐨勭粨鏋滀細鎬庢牱錛岃閮ㄩ棬鏈?鍚嶈亴鍛橈細 select sal, count(*)over() total, cast(count(*)over() as decimal)/2 mid, ceil(cast(count(*)over() as decimal)/2) next, row_number()over(order by sal) rn from emp where deptno = 30 SAL TOTAL MID NEXT RN ---- ----- ---- ---- ---- 950 6 3 3 1 1250 6 3 3 2 1250 6 3 3 3 1500 6 3 3 4 1600 6 3 3 5 2850 6 3 3 6 鐢變簬榪斿洖浜嗗伓鏁拌錛屽垯閲囩敤涓嬭堪鏂瑰紡璁$畻涓棿鏁幫細璁$畻RN鍒嗗埆絳変簬MID鍜孧ID + 1涓よ鐨勫鉤鍧囨暟銆?/p>
MySQL鍜孭ostgreSQL 鏍規嵁絎竴涓嚜鑱旀帴琛‥MP璁$畻涓棿鏁幫紝鑰岃琛ㄨ繑鍥炰簡鎵鏈夊伐璧勭殑絎涘崱鍎跨Н錛圙ROUP BY E.SAL浼氬幓鎺夐噸澶嶅鹼級銆侶AVING瀛愬彞浣跨敤鍑芥暟SUM璁$畻E.SAL絳変簬D.SAL鐨勬鏁幫紱濡傛灉榪欎釜鍊煎ぇ浜庣瓑浜嶦.SAL涓斿ぇ浜嶥.SAL嬈℃暟錛岄偅涔堣琛屽氨鏄腑闂存暟銆傚湪SELECT鍒楄〃涓姞鍏UM灝卞彲浠ヨ瀵熷埌榪欑鎯呭喌錛?/p>
select e.sal, sum(case when e.sal=d.sal then 1 else 0 end) as cnt1, abs(sum(sign(e.sal - d.sal))) as cnt2 from emp e, emp d where e.deptno = d.deptno and e.deptno = 20 group by e.sal SAL CNT1 CNT2 ---- ---- ---- 800 1 4 1100 1 2 2975 1 0 3000 4 6 Oracle 鍦∣racle Database 10g鎴朞racle9i Database涓紝鍙互浣跨敤Oracle鎻愪緵鐨勫嚱鏁拌綆椾腑闂存暟錛涘浜嶰racle8i Database錛屽彲浠ラ噰鐢―B2瑙e喅鏂規錛涘叾浠栫増鏈繀欏婚噰鐢≒ostgreSQL瑙e喅鏂規銆傛樉鐒跺彲浠ョ敤MEDIAN鍑芥暟璁$畻涓棿鍊鹼紝鐢≒ERCENTILE_CONT鍑芥暟涔熷彲浠ヨ綆椾腑闂村煎氨涓嶉偅涔堟樉鑰屾槗瑙佷簡銆備紶閫掔粰PERCENTILE_CONT鐨勫?.5鏄竴涓櫨鍒嗘瘮鍊箋傚瓙鍙ITHIN GROUP (ORDER BY SAL)紜畾PERCENTILE_CONT瑕佹悳绱㈠摢浜涙湁搴忚錛堣浣忥紝涓棿鍊煎氨鏄竴緇勫凡鎺掑簭鍊肩殑涓棿鍊鹼級銆傝繑鍥炵殑鍊煎氨鏄悳绱㈢殑鏈夊簭琛屼腑絎﹀悎緇欏畾鐧懼垎姣旓紙鍦ㄨ繖涓緥瀛愪腑鏄?.5錛屽洜涓哄叾涓や釜杈圭晫鍊煎垎鍒負0鍜?錛夌殑鍊箋?/p>
select sal
from emp
where deptno = 20
order by sal
SAL
----------
800
1100
2975
3000
3000
the mode is 3000.
瑙e喅鏂規
DB2鍜孲QL Server
浣跨敤紿楀彛鍑芥暟DENSE_RANK錛屾妸宸ヨ祫閲嶅鍑虹幇嬈℃暟鍒嗙瓑綰э紝浠ヤ究鎻愬彇妯″紡錛?/p>
1 select sal
2 from (
3 select sal,
4 dense_rank()over(order by cnt desc) as rnk
5 from (
6 select sal, count(*) as cnt
8 from emp
9 where deptno = 20
10 group by sal
11 ) x
12 ) y
13 where rnk = 1
Oracle
鍦∣racle8i Database涓紝鍙互浣跨敤DB2緇欏嚭鐨勮В鍐蟲柟妗堛傚浜嶰racle9i鍙婃洿楂樼増鏈紝鍙互鐢ㄨ仛闆嗗嚱鏁癕AX鐨凨EEP鎵╁睍錛屼互寰楀埌SAL妯″紡銆傜壒鍒娉ㄦ剰鐨勬槸錛屽鏋滃瓨鍦ㄧ粦甯︼紝涔熷嵆澶氫釜琛岄兘鏄ā寮忥紝鍒欓噰鐢↘EEP鏂規浠呰兘寰楀埌涓涓紝鍗沖叾涓伐璧勬渶楂樼殑閭d釜銆傚鏋滄兂瑕佺湅鎵鏈夋ā寮忥紙濡傛灉瀛樺湪澶氫釜妯″紡錛夛紝鍒欏繀欏諱慨鏀硅鏂規錛屾垨鑰呯畝鍗曞湴浣跨敤鍓嶉潰浠嬬粛鐨凞B2瑙e喅鏂規銆傚湪榪欎釜渚嬪瓙涓紝鐢變簬3000鏄疍EPTNO 20涓璖AL鐨勬ā寮忥紝鑰屼笖瀹冧篃鏄渶楂樼殑SAL錛屽洜姝や互涓嬫柟妗堝氨鍙互浜嗭細
1 select max(sal)
2 keep(dense_rank first order by cnt desc) sal
3 from (
4 select sal, count(*) cnt
5 from emp
6 where deptno=20
7 group by sal
8 )
MySQL鍜孭ostgreSQL
浣跨敤瀛愭煡璇㈡煡鎵炬ā寮忥細
1 select sal
2 from emp
3 where deptno = 20
4 group by sal
5 having count(*) >= all ( select count(*)
6 from emp
7 where deptno = 20
8 group by sal )
璁ㄨ
DB2鍜孲QL Server
鍐呰仈瑙嗗浘X灝嗚繑鍥炴瘡涓猄AL鍙婂畠鍑虹幇鐨勬鏁般傚唴鑱旇鍥綴浣跨敤紿楀彛鍑芥暟DENSE_RANK錛堝畠鍏佽緇戝甫錛夌粰緇撴灉鎺掑簭銆傜粨鏋滄寜姣忎釜SAL鍑虹幇鐨勬鏁板垎絳夌駭錛屽涓嬫墍紺猴細
1 select sal,
2 dense_rank()over(order by cnt desc) as rnk
3 from (
4 select sal,count(*) as cnt
5 from emp
6 where deptno = 20
7 group by sal
8 ) x
SAL RNK
----- ----------
3000 1
800 2
1100 2
2975 2
鏈澶栧眰鐨勬煡璇㈠彧綆鍗曞湴淇濈暀RNK涓?鐨勮銆?/p>
Oracle
鍐呰仈瑙嗗浘灝嗚繑鍥炴墍鏈塖AL鍙婂叾鍑虹幇鐨勬鏁幫紝濡備笅鎵紺猴細
select sal, count(*) cnt
from emp
where deptno=20
group by sal
SAL CNT
----- ----------
800 1
1100 1
2975 1
3000 2
涓嬩竴姝ワ紝浣跨敤鑱氶泦鍑芥暟MAX鐨凨EEP鎵╁睍鏌ユ壘妯″紡銆傚鏋滀粩緇嗗垎鏋愪笅闈㈢粰鍑虹殑KEEP瀛愬彞錛屼細鍙戠幇瀹冨張鏈変笁涓瓙鍙ワ紝鍗矰ENSE_RANK銆丗IRST鍜孫RDER BY CNT DESC錛?/p>
keep(dense_rank first order by cnt desc)
榪欑鍋氭硶瀵規眰妯″紡鏋佸叾鏂逛究銆侹EEP瀛愬彞鏍規嵁鍐呰仈瑙嗗浘榪斿洖鐨凜NT鍊兼潵紜畾MAX榪斿洖SAL鐨勫摢涓箋傛寜浠庡彸鍚戝乏鐨勬柟鍚戝皢CNT閫掑噺鎺掑簭錛岀劧鍚庝繚鐣欎笅鎸塂ENSE_RANK嬈″簭榪斿洖鐨勬墍鏈塁NT鍊肩殑絎竴涓箋傛煡鐪嬩竴涓嬪唴鑱旇鍥劇殑緇撴灉闆嗭紝灝變細鐪嬪埌3000鍏鋒湁鏈楂樼殑CNT鍊?鈥斺?2銆侻AX(SAL) 榪斿洖鐨勬槸鎷ユ湁鏈楂楥NT鍊肩殑鏈澶AL錛屽湪鏈緥涓槸3000銆?/p>
鏈夊叧Oracle涓泦鍚堝嚱鏁扮殑KEEP鎵╁睍鐨勬繁鍏ヨ璁猴紝璇峰弬闃呯11绔犵11.11鑺傘傛湁鍏砄racle涓泦鍚堝嚱鏁扮殑KEEP鎵╁睍鐨勬繁鍏ヨ璁猴紝璇峰弬闃呯11绔犵11.11鑺傘?/p>
MySQL鍜孭ostgreSQL
瀛愭煡璇㈠皢榪斿洖姣忎釜SAL鍑虹幇鐨勬鏁般傚灞傛煡璇㈠皢榪斿洖鍏剁殑鍑虹幇嬈℃暟澶т簬絳変簬瀛愭煡璇㈡墍榪斿洖鎵鏈夎鏁板肩殑SAL錛堟崲鍙ヨ瘽璇達紝澶栧眰鏌ヨ浼氳繑鍥濪EPTNO 20涓嚭鐜版渶澶氱殑宸ヨ祫錛夈?/p>
ENAME SAL RUNNING_DIFF
---------- ---------- ------------
MILLER 1300 1300
CLARK 2450 -1150
KING 5000 -6150
瑙e喅鏂規
DB2鍜孫racle
浣跨敤紿楀彛鍑芥暟SUM OVER鍒涘緩绱宸細
1 select ename,sal,
2 sum(case when rn = 1 then sal else -sal end)
3 over(order by sal,empno) as running_diff<>5 select empno,ename,sal,
6 row_number()over(order by sal,empno) as rn
7 from emp
8 where deptno = 10
9 ) x
MySQL銆丳ostgreSQL鍜孲QL Server
浣跨敤鏍囬噺瀛愭煡璇㈣綆楃瘡璁″樊錛?/p>
1 select a.empno, a.ename, a.sal,
2 (select case when a.empno = min(b.empno) then sum(b.sal)
3 else sum(-b.sal)
4 end
5 from emp b
6 where b.empno <= a.empno
7 and b.deptno = a.deptno ) as rnk
8 from emp a
9 where a.deptno = 10
璁ㄨ
璇ヨВ鍐蟲柟妗堜笌“鐢熸垚绱鍜?#8221;涓鑺備粙緇嶇殑瑙e喅鏂規澶ц嚧鐩稿悓銆傚敮涓鐨勫樊鍒槸錛歋AL闄や簡絎竴涓鹼紙鍥犱負瑕佷粠DEPTNO 10鐨凷AL寮濮嬶級涔嬪錛屽叾浣欐墍鏈夊奸兘榪斿洖璐熷箋?/p>
瑙e喅鏂規
浣滀負渚嬪瓙錛屾湰瑙e喅鏂規涓兘璁$畻鑱屽憳宸ヨ祫鐨勭瘡涔樼Н銆傝櫧鐒跺伐璧勭殑绱箻縐病鏈夊澶х敤澶勶紝鐒惰屽彲浠ュ緢瀹規槗鍦版妸璇ユ妧宸х敤浜庡叾浠栨洿鏈夌敤鐨勯鍩熴?/p>
DB2鍜孫racle
浣跨敤紿楀彛鍑芥暟SUM OVER錛岀敤瀵規暟鐩稿姞鏉ユā鎷熶箻娉曟搷浣滐細
1 select empno,ename,sal,
2 exp(sum(ln(sal))over(order by sal,empno)) as running_prod
3 from emp
4 where deptno = 10
EMPNO ENAME SAL RUNNING_PROD
----- ---------- ---- --------------------
7934 MILLER 1300 1300
7782 CLARK 2450 3185000
7839 KING 5000 15925000000
鍦⊿QL涓紝瀵瑰皬浜庣瓑浜?鐨勫煎彇瀵規暟鏄棤鏁堢殑銆傚鏋滆〃涓寘鍚繖鏍風殑鍊鹼紝涓瀹氳閬垮厤鎶婅繖浜涙棤鏁堢殑鍊間紶閫掔粰SQL鐨凩N鍑芥暟銆備負浜嗗鍔犲彲璇繪э紝璇ヨВ鍐蟲柟妗堝茍娌℃湁瀵規棤鏁堝煎拰NULL鍊奸噰鍙栭槻鑼冩帾鏂斤紝浣嗚嚜宸辯紪鍐欎唬鐮佹椂錛屼竴瀹氳鑰冭檻鏄惁闇瑕佽繖縐嶉闃層傚鏋滀竴瀹氳鐢ㄥ埌璐熷煎拰0鍊鹼紝閭d箞榪欑瑙e喅鏂規涓嶅悎閫傘?/p>
Oracle鐙湁鐨勫彟涓縐嶈В鍐蟲柟妗堟槸浣跨敤Oracle Database 10g鏂板紩鍏ョ殑MODEL瀛愬彞銆傚湪涓嬮潰鐨勪緥瀛愪腑錛屾瘡涓猄AL閮芥槸璐熸暟錛岃繖琛ㄦ槑绱箻縐厑璁稿嚭鐜拌礋鍊鹼細
1 select empno, ename, sal, tmp as running_prod
2 from (
3 select empno,ename,-sal as sal
4 from emp
5 where deptno=10
6 )
7 model
8 dimension by(row_number()over(order by sal desc) rn )
9 measures(sal, 0 tmp, empno, ename)
10 rules (
11 tmp[any] = case when sal[cv()-1] is null then sal[cv()]
12 else tmp[cv()-1]*sal[cv()]
13 end
14 )
EMPNO ENAME SAL RUNNING_PROD
----- ---------- ---- --------------------
7934 MILLER -1300 -1300
7782 CLARK -2450 3185000
7839 KING -5000 -15925000000
MySQL銆丳ostgreSQL鍜孲QL Server
榪樺彲浠ヤ嬌鐢ㄥ鏁扮浉鍔犵殑鏂規硶錛屼絾榪欎簺騫沖彴騫朵笉鏀寔紿楀彛鍑芥暟錛屽洜姝ょ敤鏍囬噺瀛愭煡璇㈠彇鑰屼唬涔嬶細
1 select e.empno,e.ename,e.sal,
2 (select exp(sum(ln(d.sal)))
3 from emp d
4 where d.empno <= e.empno
5 and e.deptno=d.deptno) as running_prod
6 from emp e
7 where e.deptno=10
EMPNO ENAME SAL RUNNING_PROD
----- ---------- ---- --------------------
7782 CLARK 2450 2450
7839 KING 5000 12250000
7934 MILLER 1300 15925000000
SQL Server鐢ㄦ埛浣跨敤LOG浠f浛LN銆?/p>
璁ㄨ
闄や簡MODEL瀛愬彞鏂規錛堜粎瀵筄racle Database 10g鎴栨洿楂樼増鏈彲鐢級涔嬪錛屾墍鏈夎В鍐蟲柟妗堥兘鍒╃敤浜嗕箻娉曡繍綆楃殑鐗規э紝鎸変笅鍒楁楠ょ敤鍔犳硶榪涜璁$畻錛?/p>
1. 璁$畻鍚勮嚜鐨勮嚜鐒跺鏁?/p>
2. 璁$畻榪欎簺瀵規暟鐨勫拰
3. 瀵圭粨鏋滆繘琛屾暟瀛﹀父閲廵鐨勫箓榪愮畻錛堜嬌鐢‥XP鍑芥暟錛?/p>
褰撻噰鐢ㄨ繖縐嶆柟娉曟椂錛岄渶瑕佹敞鎰忥紝瀵逛簬0鍊煎拰璐熷鹼紝榪欑鏂規硶涓嶅彲琛岋紝鍥犱負浠諱綍灝忎簬絳変簬0鐨勫奸兘瓚呭嚭浜哠QL瀵規暟鐨勫畾涔夊煙銆?/p>
DB2鍜孫racle
鏈夊叧紿楀彛鍑芥暟SUM OVER鐨勫姛鑳斤紝璇峰弬闃?#8220;鐢熸垚绱鍜?#8221;涓鑺傘?/p>
瀵逛簬Oracle Database 10g鎴栨洿楂樼増鏈紝鍙互浣跨敤MODEL瀛愬彞鐢熸垚绱箻縐傚悓鏃朵嬌鐢∕ODEL瀛愬彞鍙婄獥鍙e嚱鏁癛OW_NUMBER錛屽緢瀹規槗灝辮兘璁塊棶鍓嶉潰鐨勮銆傚彲浠ュ儚璁塊棶鏁扮粍涓鏍瘋闂甅EASURES鍒楄〃涓殑姣忎竴欏廣傜劧鍚庯紝鍙互浣跨敤DIMENSIONS鍒楄〃涓殑欏癸紙鐢盧OW_NUMBER榪斿洖鐨勫鹼紝鍒悕RN錛夋悳绱㈣鏁扮粍錛?/p>
select empno, ename, sal, tmp as running_prod,rn
from (
select empno,ename,-sal as sal
from emp
where deptno=10
)
model
dimension by(row_number()over(order by sal desc) rn )
measures(sal, 0 tmp, empno, ename)
rules ()
EMPNO ENAME SAL RUNNING_PROD RN
----- ---------- ---------- ------------ ----------
7934 MILLER -1300 0 1
7782 CLARK -2450 0 2
7839 KING -5000 0 3
瑙傚療涓涓嬶紝浼氬彂鐜癝AL[1]鐨勫間負錛?300銆傜敱浜庢暟瀛楅愪竴榪炵畫閫掑銆佹病鏈夐棿闅欙紝鎵浠ュ彲浠ラ氳繃鍑?鏉ュ紩鐢ㄥ墠涓琛屻俁ULES瀛愬彞濡備笅錛?/p>
rules (
tmp[any] = case when sal[cv()-1] is null then sal[cv()]
else tmp[cv()-1]*sal[cv()]
end
)
瀹冧嬌鐢ㄥ唴緗搷浣滅ANY澶勭悊姣忎竴琛岋紝鑰屽茍鏈繘琛岀‖緙栫爜銆傝繖涓緥瀛愪腑ANY鐨勫煎垎鍒負1銆?鍜?銆傛妸TMP[n]鍒濆鍖栦負0銆傞氳繃璁$畻鐩稿簲SAL琛岀殑褰撳墠鍊鹼紙鍑芥暟CV榪斿洖褰撳墠鍊鹼級錛屽彲浠ョ粰TMP[n]鎸囧畾涓涓箋傛妸TMP[1]鍒濆鍖栦負0錛屾妸SAL[1]鍒濆鍖栦負錛?300銆係AL[0]娌℃湁鍊鹼紝鎵浠ユ妸TMP[1]璁劇疆涓篠AL[1]銆傚湪璁劇疆浜員MP[1]涔嬪悗錛屼笅涓琛屽氨鏄疶MP[2]銆傝綆楃涓涓猄AL[1]錛堢敱浜嶢NY鐨勫綋鍓嶅兼槸2錛屽洜姝AL[CV()錛?]鐨勫兼槸SAL[1]錛夈係AL[1]涓嶄負絀猴紝鑰屼笖絳変簬錛?300錛屽洜姝ゆ妸TMP[2]璁劇疆涓篢MP[1]鍜孲AL[2]鐨勪箻縐傛墍鏈夎閮借繘琛屼笂榪版搷浣溿?/p>
MySQL銆丳ostgreSQL鍜孲QL Server
鏈夊叧MySQL銆丳ostgreSQL鍜孲QL Server瑙e喅鏂規鎵閲囩敤鐨勫瓙鏌ヨ鏂規硶鐨勮鏄庯紝璇峰弬闃呮湰绔犵7.6鑺傘?/p>
瑕佹敞鎰忥紝鍩轟簬瀛愭煡璇㈣В鍐蟲柟妗堢殑杈撳嚭涓嶰racle鍜孌B2瑙e喅鏂規鐨勮緭鍑烘湁灝戣宸埆錛屽叾鍘熷洜鏉ヨ嚜EMPNO姣旇緝錛堝畠浠寜涓嶅悓鐨勯『搴忚綆楃瘡涔樼Н錛夈備笌绱鍜屼竴鏍鳳紝鍏舵繪暟涔熸槸鐢辨爣閲忓瓙鏌ヨ鐨勮皳璇嶉┍鍔ㄧ殑錛涘湪璇ヨВ鍐蟲柟妗堜腑錛岃鏄寜EMPNO鎺掑簭鐨勶紝鑰屽浜嶰racle/DB2 瑙e喅鏂規錛岃鏄寜SAL鎺掑簭鐨勩?/p>
瑙e喅鏂規
涓嬮潰緇欏嚭浜嗕竴縐嶈В鍐蟲柟妗堬紝瀹冨睍紺轟簡濡備綍璁$畻鎵鏈夎亴鍛樺伐璧勭殑绱鍜屻備負澧炲姞鍙鎬э紝鍏剁粨鏋滄槸鎸塖AL鎺掑簭鐨勶紝榪欐牱灝辮兘澶熷緢瀹規槗鍦拌瀵熷埌绱鍜屽彉鍖栫殑榪囩▼銆?/p>
DB2鍜孫racle
浣跨敤紿楀彛鐗堟湰鐨凷UM鍑芥暟璁$畻绱鍜岋細
1 select ename, sal,
2 sum(sal) over (order by sal,empno) as running_total
3 from emp
4 order by 2
ENAME SAL RUNNING_TOTAL
---------- ---------- -------------
SMITH 800 800
JAMES 950 1750
ADAMS 1100 2850
WARD 1250 4100
MARTIN 1250 5350
MILLER 1300 6650
TURNER 1500 8150
ALLEN 1600 9750
CLARK 2450 12200
BLAKE 2850 15050
JONES 2975 18025
SCOTT 3000 21025
FORD 3000 24025
KING 5000 29025
MySQL銆丳ostgreSQL鍜孲QL Server
浣跨敤鏍囬噺瀛愭煡璇㈣綆楃瘡璁″拰錛堢敱浜庝笉浣跨敤SUM OVER榪欑被紿楀彛鍑芥暟錛屽洜姝ゅ氨涓嶈兘鍍忓湪DB2鍜孫racle瑙e喅鏂規涓偅鏍峰鏄撳湴鎸塖AL緇欑粨鏋滄帓搴忥級銆備笉綆℃庝箞璇達紝绱鍜屾槸姝g‘鐨勶紙鏈緇堢粨鏋滀笌涓婁竴鑺傜浉鍚岋級錛屼絾鐢變簬娌℃湁榪涜鎺掑簭錛屽叾涓棿鍊兼湁鎵涓嶅悓錛?/p>
1 select e.ename, e.sal,
2 (select sum(d.sal) from emp d
3 where d.empno <= e.empno) as running_total
4 from emp e
5 order by 3
ENAME SAL RUNNING_TOTAL
---------- ---------- -------------
SMITH 800 800
ALLEN 1600 2400
WARD 1250 3650
JONES 2975 6625
MARTIN 1250 7875
BLAKE 2850 10725
CLARK 2450 13175
SCOTT 3000 16175
KING 5000 21175
TURNER 1500 22675
ADAMS 1100 23775
JAMES 950 24725
FORD 3000 27725
MILLER 1300 29025
璁ㄨ
鐢熸垚绱鍜屾槸鍥犱嬌鐢ㄦ柊鐨凙NSI紿楀彛鍑芥暟鑰屽緱浠ョ畝鍖栫殑浠誨姟涔嬩竴銆傚浜庝笉鏀寔榪欎簺紿楀彛鍑芥暟鐨凞BMS錛岄渶瑕佷嬌鐢ㄦ爣閲忓瓙鏌ヨ錛堟寜鍙栧煎敮涓鐨勫瓧孌佃仈鎺ワ級銆?/p>
DB2鍜孫racle
紿楀彛鍑芥暟SUM OVER鑳藉闈炲父瀹規槗鍦扮敓鎴愮瘡璁″拰銆傝瑙e喅鏂規涓殑ORDER BY瀛愬彞涓嶄粎鍖呭惈SAL鍒楋紝鑰屼笖榪樺寘鍚獷MPNO鍒楋紙涓婚敭錛夛紝浠ラ伩鍏嶇瘡璁″拰涓嚭鐜伴噸澶嶅箋備笅闈緥瀛愪腑鐨凴UNNING_TOTAL2鍒楃ず鎰忎簡瀛樺湪閲嶅鍊兼椂鍙兘甯︽潵鐨勯棶棰橈細
select empno, sal,
sum(sal)over(order by sal,empno) as running_total1,
sum(sal)over(order by sal) as running_total2
from emp
order by 2
ENAME SAL RUNNING_TOTAL1 RUNNING_TOTAL2
---------- ---------- -------------- --------------
SMITH 800 800 800
JAMES 950 1750 1750
ADAMS 1100 2850 2850
WARD 1250 4100 5350
MARTIN 1250 5350 5350
MILLER 1300 6650 6650
TURNER 1500 8150 8150
ALLEN 1600 9750 9750
CLARK 2450 12200 12200
BLAKE 2850 15050 15050
JONES 2975 18025 18025
SCOTT 3000 21025 24025
FORD 3000 24025 24025
KING 5000 29025 29025
瀵逛簬WARD銆丮ARTIN銆丼COTT鍜孎ORD錛孯UNNING_TOTAL2涓殑鍊奸兘涓嶆紜備粬浠殑宸ヨ祫鍒嗗埆鍑虹幇浜嗗嬈★紝榪欎簺閲嶅鍊奸兘琚姞鍦ㄤ竴璧瘋鍏ョ瘡璁″拰銆傝繖灝辨槸闇瑕佷嬌鐢‥MPNO錛堝畠鏄敮涓鐨勶級鎵嶈兘鐢熸垚涓嶳UNNING_TOTAL1涓鏍風殑錛堟紜級緇撴灉鐨勫師鍥犮傚ぇ瀹舵兂涓鎯籌細瀵逛簬ADAMS錛孯UNNING_TOTAL1鐨勫間負2850錛孯UNNING_TOTAL2鎶奧ARD鐨勫伐璧?250涓?850鐩稿姞錛屽簲璇ュ緱鍒?100錛岀劧鑰岋紝RUNNING_TOTAL2鍗磋繑鍥炰簡5350錛岃繖鏄負浠涔堝憿錛熷洜涓篧ARD鍜孧ARTIN鐨凷AL鐩稿悓錛屼粬浠袱涓殑宸ヨ祫錛?250錛夊姞鍦ㄤ竴璧峰氨絳変簬2500錛岀劧鍚庡啀鍔?850錛屽氨寰楀埌5350銆傚鏋滄寚瀹氭寜涓嶄細鏈夐噸澶嶅肩殑鍒楃粍鍚堬紙渚嬪錛孲AL鍜孍MPNO鐨勫彇鍊肩粍鍚堥兘鏄敮涓鐨勶級鎺掑簭錛屽氨鑳界‘淇濈敓鎴愭紜殑绱鍜屻?/p>
MySQL銆丳ostgreSQL鍜孲QL Server
鍦ㄨ繖浜汥BMS瀹屽叏鏀寔紿楀彛鍑芥暟涔嬪墠錛屽彲浠ヤ嬌鐢ㄦ爣閲忓瓙鏌ヨ璁$畻绱鍜屻備竴瀹氳鎸夊彇鍊煎敮涓鐨勫垪鑱旀帴錛屽惁鍒欎竴鏃﹀瓨鍦ㄥ儚宸ヨ祫閲嶅榪欐牱鐨勬儏鍐碉紝灝變細浜х敓涓嶆紜殑绱鍜屻傛湰鑺傝В鍐蟲柟妗堢殑鍏抽敭鏄妸D.EMPNO涓嶦.EMPNO鑱旀帴璧鋒潵錛屽畠浼氳繑鍥烇紙姹傚拰錛夋瘡涓弧瓚矰.EMPNO灝忎簬鎴栫瓑浜嶦.EMPNO D.SAL銆備負浜嗘洿瀹規槗鐞嗚В榪欎簺鍐呭錛屽彲浠ラ噸鏂扮紪鍐欐爣閲忓瓙鏌ヨ錛屾妸瀹冨啓鎴愯亴鍛樹箣闂寸殑鑱旀帴錛?/p>
select e.ename as ename1, e.empno as empno1, e.sal as sal1,
d.ename as ename2, d.empno as empno2, d.sal as sal2
from emp e, emp d
where d.empno <= e.empno
and e.empno = 7566
ENAME EMPNO1 SAL1 ENAME EMPNO2 SAL2
---------- ---------- ---------- ---------- ---------- ----------
JONES 7566 2975 SMITH 7369 800
JONES 7566 2975 ALLEN 7499 1600
JONES 7566 2975 WARD 7521 1250
JONES 7566 2975 JONES 7566 2975
EMPNO2涓殑姣忎釜鍊間笌EMPNO1涓殑姣忎釜鍊肩浉姣旇緝銆傚浜嶦MPNO2鍊煎皬浜庣瓑浜嶦MPNO1鍊肩殑鎵鏈夎錛岄兘浼氭妸SAL2鍊煎姞鍏ユ誨拰銆傚湪榪欎釜渚嬪瓙涓紝鑱屽憳Smith銆丄llen銆乄ard鍜孞ones鐨凟MPNO鍊奸兘涓嶫ones鐨凟MPNO鍊肩浉姣旇緝銆傜敱浜庤繖鍥涗釜鑱屽憳鐨凟MPNO閮芥弧瓚沖皬浜庣瓑浜嶫ones鐨凟MPNO鐨勬潯浠訛紝鎵浠ヤ細鎶婅繖浜涘伐璧勫姞璧鋒潵錛涜岄偅浜涘ぇ浜嶫ones鐨凟MPNO鐨勮亴鍛橀兘涓嶄細璁″叆SUM涓傚畬鏁寸殑鏌ヨ鐨勮綆楁柟娉曟槸錛氬皢鎵鏈塃MPNO灝忎簬絳変簬7934錛圡iller鐨凟MPNO錛岃繖涓〃涓殑鏈澶у鹼級鐨勬墍鏈夎亴鍛樼殑宸ヨ祫鍔犺搗鏉ャ?/p>