Oracle使用技巧

上传人:321****12 文档编号:157036701 上传时间:2022-09-28 格式:DOCX 页数:68 大小:110.41KB
返回 下载 相关 举报
Oracle使用技巧_第1页
第1页 / 共68页
Oracle使用技巧_第2页
第2页 / 共68页
Oracle使用技巧_第3页
第3页 / 共68页
点击查看更多>>
资源描述
case 子句的用途语法: case wheen 条件1 then 值1 whhen条件22 thenn 值2。when条件nn thenn 值nelse 值eelseennd case子句相相当于一个具具有多个选择择的语句,在在多个不同的的条件中,选选择其中之一一,与javva语言的ccase语句句类似。例:如果表chhinesee的字段bhh为nulll,则返回00,如果字段段bh为1,则返回999,字段bhh为其它值,原原样返回。select casse wheen bh is null then 0 wheen bh=1 then 99 ellse bhh endd bhs, xh,code frrom chhinesee 一、利用CASSE 语句更更新列值执行本语句将性性别为男的伙伙食补助修改改为120,女女修改为1000UPDATE TB_EMMP2SET 伙食补补助=CASSE WHEEN 性别=男 tthen 1120 WHHEN 性别别=女 then 100END当列cj的值为为74时,修修改其值为880, 为97时,修修改其值为1100,其它它值不变update tb set cj=(casee cj when 74 then 80when 977 then 100else cjj end);当列kc的值为为语文时,修改列列cj=cjj+6, 为物理时,修改其其值为cj+4,其它值值不变update tb set cj=(casee when kkc=语文 then ccj+6when kcc=物理 then ccj+4else cjj end);/利用CASE 语句进行更更新列值执行本语句将性性别为男的伙伙食补助修改改为120,女女修改为1000UPDATE TB_EMMP2SET 伙食补补助=CASSE WHEEN 性别=男 tthen 1120 WHHEN 性别别=女 then 100END当列cj的值为为74时,修修改其值为880, 为97时,修修改其值为1100,其它它值不变update tb set cj=(casee cj when 74 then 80when 977 then 100else cjj end);当列kc的值为为语文时,修改列列cj=cjj+6, 为物理时,修改其其值为cj+4,其它值值不变update tb set cj=(casee when kkc=语文 then ccj+6when kcc=物理 then ccj+4else cjj end);case语句在在SQL中的的使用方法 Case具有两两种格式。简简单Casee函数和Caase搜索函函数。 1.简单Casse函数CASE seex WHEEN 1 THENN 男 WHEEN 2 THENN 女ELSE 其其他 ENND2.搜索casse函数CASE WHHEN seex = 1 THHEN 男男 WHEEN sexx = 22 THEEN 女ELSE 其其他 ENND这两种方式,可可以实现相同同的功能。简简单Casee函数的写法法相对比较简简洁,但是和和Case搜搜索函数相比比,功能方面面会有些限制制,比如写判判断式。 还有一个需要注注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。 -比如说,下下面这段SQQL,你永远远无法得到“第二类”这个结果CASE WHHEN cool_1 IN ( a, b) TTHEN 第一类 WHEEN coll_1 INN (a) THHEN 第第二类ELSE其他他 ENDDCase使用集集锦一,已知数据按按照另外一种种方式进行分分组,分析。 下面的Casse语句用在在Groupp by 子子句中有如下数据:(为了看得更更清楚,我并并没有使用国国家代码,而而是直接用国国家名作为PPrimarry Keyy) 国家(counntry) 人口(poopulattion) 中国 6600 美国 1100 加拿大 100 英国 2200 法国 3300 日本 2250 德国 2200 墨西哥 50 印度 2250 根据国家人口数数据,统计亚亚洲和北美洲洲的人口数量量。应该得到到下面这个结结果。 洲 人口 亚洲 11000 北美洲 2550 其他 7000 想要解决这个问问题,你会怎怎么做?生成成一个带有洲洲Code的的View,是是一个解决方方法,但是这这样很难动态态的改变统计计的方式。 如果使用Casse函数,SSQL代码如如下: SELECT SUM(popullationn), CASEE counntry WWHEN 中国 THHEN 亚亚洲 WWHEN 印度 THHEN 亚亚洲 WWHEN 日本 THHEN 亚亚洲 WWHEN 美国 THHEN 北北美洲 WWHEN 加拿大 THENN 北美洲洲 WWHEN 墨西哥 THENN 北美洲洲 ELSEE 其他 ENDFROM Tablle_AGROUP BBY CASSE couuntry WWHEN 中国 THHEN 亚亚洲 WWHEN 印度 THHEN 亚亚洲 WWHEN 日本 THHEN 亚亚洲 WWHEN 美国 THHEN 北北美洲 WWHEN 加拿大 THENN 北美洲洲 WWHEN 墨西哥 THENN 北美洲洲 ELSEE 其他 END;同样的,我们也也可以用这个个方法来判断断工资的等级级,并统计每每一等级的人人数。SQLL代码如下; SELECT CASEE WHENN salaary 500 AAND saalary 600 AAND saalary 800 AAND saalary = 10000 THHEN 44 ELSEE NULLL END salarry_claass, COUNNT(*)FROM Tablle_AGROUP BBY CASEE WHENN salaary 500 AAND saalary 600 AAND saalary 800 AAND saalary 1000 THEEN 1 EELSE 00 END ELSE 1 ENDD = 1 )如果单纯使用CCheck,如如下所示 CONSTRAAINT ccheck_salarry CHEECK ( sex = 2 AND salarry 11000 )女职员的条件倒倒是符合了,男男职员就无法法输入了。这这是一个非常常经典的用法法!四,根据条件有有选择的UPPDATE。 下面的Casse语句用在在updatte子句中,如如果进行两次次更新,则可可能会产生错错误!例,有如下更新新条件 工资5000以以上的职员,工工资减少100% 工资在20000到46000之间的职员员,工资增加加15% 很容易考虑的是是选择执行两两次UPDAATE语句,如如下所示 -条件1UPDATE PersoonnelSET sallary = salaary * 0.9WHERE ssalaryy = 55000;-条件2UPDATE PersoonnelSET sallary = salaary * 1.15WHERE ssalaryy = 22000 AAND saalary = 50000 THENN salaary * 0.9WHEN saalary = 20000 ANND sallary 46000THEN saalary * 1.115ELSE saalary END;这里要注意一点点,最后一行行的ELSEE salaary是必需需的,要是没没有这行,不不符合这两个个条件的人的的工资将会被被写成NUlll,那可就就大事不妙了了。在Casse函数中EElse部分分的默认值是是NULL,这这点是需要注注意的地方。 五变更主键列列的值本质上任然是是Case语语句在upddate中的的应用一般情况下,要要想把两条数数据的Priimary key,aa和b交换,需需要经过临时时存储,拷贝贝,读回数据据的三个过程程,要是使用用Case函函数的话,一一切都变得简简单多了。 p_key ccol_1 col_22 a 1 张张三 b 2 李李四 c3 王五五 假设有如上数据据,需要把主主键a和b相相互交换。用用Case函函数来实现的的话,代码如如下 UPDATE SomeTTableSET p_kkey =CASE WHHEN p_key = a THENN bWHEN p_key = b THENN aELSE p_key EENDWHERE pp_key IN (a, b);同样的也可以交交换两个Unnique key。需需要注意的是是,如果有需需要交换主键键的情况发生生,多半是当当初对这个表表的设计进行行得不够到位位,建议检查查表的设计是是否妥当。 六,两个表数据据是否一致的的检查。 Case函数数中,可以使使用下列子句:BETWEENN ANDD , LIKE,IS NULLL,IN, NOTT INEXISTS 和NOT EXISTTSCase函数不不同于DECCODE函数数。在Casse函数中,可可以使用BEETWEENN,LIKEE,IS NNULL,IIN,EXIISTS等等等。比如说使使用IN,EEXISTSS,可以进行行子查询,从从而 实现更更多的功能。 下面具个例子来来说明,有两两个表,tbbl_A,ttbl_B,两两个表中都有有keyCool列。现在在我们对两个个表进行比较较,tbl_A中的keeyCol列列的数据如果果在tbl_B的keyyCol列的的数据中可以以找到, 返返回结果MMatcheed,如果果没有找到,返返回结果UUnmatcched。 要实现下面这个个功能,可以以使用下面两两条语句 1.使用IN的的时候SELECT keyCool,CASE WHHEN keeyCol IN ( SSELECTT keyCCol FRROM tbbl_B ) when中中使用in 子句THEN MMatcheedELSE UUnmatcched END LLabelFROM tbbl_A;2.使用EXIISTS的时时候SELECT keyCool,CASE WHHEN EXXISTS ( SELLECT * FROMM tbl_BWHERE ttbl_A.keyCool = ttbl_B.keyCool )THEN MMatcheedELSE UUnmatcched END LLabelFROM tbbl_A;使用IN和EXXISTS的的结果是相同同的。也可以以使用NOTT IN和NNOT EXXISTS,但但是这个时候候要注意NUULL的情况况。 七,在Casee函数中使用用合计函数 假设有下面一个个表学号(std_id) 课课程ID(cclass_id) 课课程名(cllass_nname) 主修flaag(maiin_claass_fllg) 100 1 经经济学 Y 100 2 历历史学 N 200 2 历历史学 N 200 3 考考古学 Y 200 4 计计算机 N 300 4 计计算机 N 400 5 化化学 N 500 6 数数学 N 有的学生选择了了同时修几门门课程(1000,2000)也有的学学生只选择了了一门课程(300,4400,5000)。选修修多门课程的的学生,要选选择一门课程程作为主修,主主修flagg里面写入 Y。只选择择一门课程的的学生,主修修flag为为N(实际上上要是写入YY的话,就没没有下面的麻麻烦事了,为为了举例子,还还请多多包含含)。 现在我们要按照照下面两个条条件对这个表表进行如下查查询 :l 只选修一门课程程的学生,返返回那门课程程的ID l 选修多门课程的的学生,返回回所选的主课课程ID 简单的想法就是是,执行两条条不同的SQQL语句进行行查询。 -条件1:只只选择了一门门课程的学生生SELECT std_iid, MAAX(claass_idd) AS main_classsFROM SttudenttclasssGROUP BBY stdd_idHAVING COUNTT(*) = 1;执行结果1 STD_ID MAIIN_claass- -300 4400 5500 6-条件2:选选择多门课程程的学生SELECT std_iid, cllass_iid AS main_classsFROM SttudenttclasssWHERE mmain_cclass_flg = Y ;执行结果2 STD_ID MAINN_classs- -100 1200 3如果使用Casse函数,我我们只要一条条SQL语句句就可以解决决问题,具体体如下所示 SELECT std_id,CASE WHHEN COOUNT(*) = 11 THENN MAX(classs_id) -只选选择一门课程程的学生的情情况ELSE MAAX(CASE WHEN main_classs_flg = YTHEN cllass_iidELSE NUULL ENND)END AS main_classsFROM SttudenttclasssGROUP BBY stdd_id;运行结果 STD_ID MAIIN_claass- -100 1200 3300 4400 5500 6通过在Casee函数中嵌套套Case函函数,在合计计函数中使用用Case函函数等方法,我我们可以轻松松的解决这个个问题。使用用Case函函数给我们带带来了更大的的自由度。 最后提醒一下使使用Casee函数的新手手注意不要犯犯下面的错误误 CASE cool_1WHEN 1 THEEN RiightWHEN NUULL TTHEN WronggEND在这个语句中WWhen NNull这一一行总是返回回unknoown,所以以永远不会出出现Wronng的情况。因因为这句可以以替换成WHHEN cool_1 = NULLL,这是一个个错误的用法法,这个时候候我们应该选选择用WHEEN coll_1 ISS NULLL。正确的做做法是:CASE cool_1WHEN 11 THEEN RiightWHEN IIS NULLL THHEN WWrongENDcoalescce函数语法:coallesce(paramm1,parram2)当第一个参数pparam11(通常为字字段)为nulll时,返回第第二个参数pparam22的值,否则则,返回第一一个参数的值值.这个函数数与NVL函函数功能相同同。例: seleect coaleesce(bbh,0) bhss fromm chinnese selecct nvll(bh,00) bhss fromm chinnese从表中随机返回回n条记录实现此功能需要要使用函数ddbms_rrandomm.valuue()作为orrder bby子句的参参数,这样查询将依赖赖于函数的结结果进行排序序。利用这个个函数可以实实现随机出题题例1:随机产生生100条歇歇后语记录Select * from (select xh,coontentt,keyss fromm xhy orderr by dbmms_ranndom.vvalue()Where rrownumm=100;例2:利用函数数dbms_randoom.vallue()产生1000个随机数数Oracle 10g方法select dbms_randoom.vallue() from ddual cconnecct by rownuum=100Oracle 9i方法select dbms_randoom.vallue() from all_oobjectts rownuum=100根据学生成绩排排名次要求:要求输出出前n名学生生,同一成绩绩名次相同。原理:利用deense_rrank()这个分析函函数进行名次次排列主要数据如下Xmscorrec72x83b83d65h96n57y90m99v100输出前5名Xmscorre mcn571d652c723x834b834y905select * froom( sellect xxm,scoore,deense_rrank()over(orderr by scoree) mc from sstudenntscorre t)wheree mc=5oracle使使用mergee更新或插入入数据使用mergee比传统的先先判断再选择择插入或更新新快很多。11)主要功能能提供有条件件地更新和插插入数据到数数据库表中如如果该行存在在,执行一个个UPDATTE操作,如如果是一个新新行,执行IINSERTT操作 避免了分分开更新 提高性能能并易于使用用 在数据仓仓库应用中十十分有用2)MMERGE语语句的语法如如下:MERRGE hhint INTO scheema . tablle t_aliass USIING sschemaa . tablee | viiew | subquuery t_aalias ON ( condditionn )WHEEN MATTCHED THEN mergee_updaate_cllauseWWHEN NNOT MAATCHEDD THENN mergge_inssert_cclausee;还是看例例子就知道怎怎么回事:MMERGE INTO copy_emp ccUSINGG emplloyeess eON (c.emmployeee_id=e.empployeee_id)WWHEN MMATCHEED THEENUPDAATE SEETc.fiirst_nname=ee.firsst_namme,c.llast_nname=ee.lastt_namee,c.deepartmment_iid=e.ddeparttment_idWHEEN NOTT MATCCHED TTHENINNSERT VALUEES(e.eemployyee_idd,e.fiirst_nname,ee.lastt_namee,e.emmail,ee.phonne_nummber,ee.hiree_datee,e.joob_id,e.sallary,mmissioon_pctt,e.maanagerr_id,ee.depaartmettn_id);MERGGE INTTO coppy_empp cUSIING emmployeees eOON (c.emplooyee_iid=e.eemployyee_idd)WHENN MATCCHED TTHENUPPDATE SETc.firstt_namee=e.fiirst_nname,cc.lastt_namee=e.laast_naame,c.deparrtmentt_id=ee.depaartmennt_idWWHEN NNOT MAATCHEDD THENNINSERRT VALLUES(ee.emplloyee_id,e.firstt_namee,e.laast_naame,e.emaill,e.phhone_nnumberr,e.hiire_daate,e.job_iid,e.ssalaryy,e.coommisssion_ppct,e.managger_idd,e.deepartmmetn_iid);3)使使用mergge的注意事事项:创建测测试表:CRREATE TABLEE MM (ID NUUMBER, NAMEE VARCCHAR2(20);CREATTE TABBLE MNN (ID NUMBEER, NAAME VAARCHARR2(20);插入数数据INSEERT INNTO MMM VALUUES (11, A);INSSERT IINTO MMN VALLUES (1, BB);执行行:MERGGE INTTO MN AUSINNG MM BON(AA.ID=BB.ID)WWHEN MMATCHEED THEENUPDAATE SEET A.IID = BB.IDWHHEN NOOT MATTCHED THENIINSERTT VALUUES(B.ID, BB.NAMEE);ON(A.ID=B.ID)报错:无效效的标识符,这个错误提提示有些误导导嫌疑,原因因是on子句句的使用的字字段不能够用用于updaate,即OOraclee不允许更新新用于连接的的列修改:MERRGE INNTO MNN AUSIING MMM BON(A.ID=B.ID)WHEN MATCHHED THHENUPDDATE SSET A.NAME = B.NNAMEWHHEN NOOT MATTCHED THENIINSERTT VALUUES(B.ID, BB.NAMEE);ON(A.ID=B.ID)再插入:IINSERTT INTOO MM VVALUESS (1, C);再执行:MEERGE IINTO MMN AUSSING MMM BONN(A.IDD=B.IDD)WHENN MATCCHED TTHENUPPDATE SET AA.NAMEE = B.NAMEWWHEN NNOT MAATCHEDD THENNINSERRT VALLUES(BB.ID, B.NAMME);ONN(A.IDD=B.IDD)报错,原原因无法在源源表中获得一一组稳定的行行4)更新同同一张表的数数据。需要注注意下细节,因因为可能涉及及到usinng的数据集集为nulll,所以要使使用counnt()函数数。MERGGE INTTO mn aUSINNG (seelect countt(*) cco froom mn wheree mn.IID=4) bON (b.co0)-这里使用了了countt和,注注意下,想下下为什么!WWHEN MMATCHEED THEENUPDAATESETT a.NAAME = Ewhhere aa.ID=44WHEN NOT MMATCHEED THEENINSEERTVALLUES (4, EE);计算中位(间)值一、问题计算一列数字值值的中间值(中中间值就是一一组有序元素素中间成员的的值)。假设有如下数据据:create tablee empIInfo( name vvarchaar2(200), sal nuumber(6)insert into empInnfo vaalues(王宏,800);insert into empInnfo vaalues(留心会,11000);insert into empInnfo vaalues(张三,1500);insert into empInnfo vaalues(李薇霞,30000);insert into empInnfo vaalues(大大村,25000);insert into empInnfo vaalues(杨伟,2750);select * froom emppInfo orderr by sall王宏800留心会11000张三15000大大村25000杨伟27500李薇霞30000中位数应为:22000=(1500+2500)/2二、解决方案除了Oraclle解决方案案(用函数计计算中间数)之之外,其他所所有解决方案案都是以Roozenshhtein、AAbramoovich和和Birgeer在Opttimiziing Trransacct-SQLL: Advvancedd Proggrammiing Teechniqques (SQL FForum Presss, 19997)中描述述的方法为基基础的。与传传统的自联接接相比,窗口口函数的引入入,使解决方方案更为有效效。1. 通用求中中位数的方法法使用自联接查找找中间数:其其原理是:首先进行自连接接,获得笛卡卡尔积;其次次计算各记录录sal字段段的差并转换换为符号函数数,即:sign(e.sal - d.sal)以及各个记记录sal字字段是否相同同,用下列语语句实现:case whhen e.sal = d.sal thhen 1 else 00 end;然后后再进行分组组,并计算组组内sal字字段的平均值值。如果一列数为奇奇数个数,则则这列数必定定关于中间一一个数的abbs(sum(sign(e.sal - d.sal)成对称。如如果一列数为为偶数个数,则则这列数必定定关于中间的的两个数成对对称。select avg(sal) from ( -找到中中间位置的ssal值 selecct e.sal from empInnfo e, empIInfo dd groupp by e.sal havinng sum(casee when ee.sal = d.sal thhen 1 else 00 end )= abs(sum(sign(e.sal - d.sal)-eend abbs)t根据第一个自联联接表EMPP计算中间数数,而该表返返回了所有工工资的笛卡儿儿积(GROOUP BYY E.SSAL会去掉掉重复值)。HHAVINGG子句使用函函数SUM计计算E.SAAL等于D.SAL的次次数;如果这这个值大于等等于E.SAAL且大于DD.SAL次次数,那么该该行就是中间间数。在SEELECT列列表中加入SSUM就可以以观察到这种种情况:select avg(sal) from ( -找到中中间位置的ssal值 selecct e.sal,countt(e.sal) ncouunt,sum(caase when ee.sal = d.sal thhen 1 else 00 end) sum00,abs(suum(sign(e.sal - d.sal) ) abs00 from empInnfo e, empIInfo dd groupp by e.sal havinng sum(casee when ee.sal = d.sal thhen 1 else 00 end )= abs(sum(sign(e.sal - d.sal)-endd abs)t8007161100714150071222007102500712275071430007162.DB2,OOraclee 数据库使用窗口函数CCOUNT(*) OVVER和ROOW_NUMMBER,查查找中间数:select avg(saal) frrom(-通过分析函函数为查询添添加3列:ttotal,hhalf,xxh seleect saal, counnt(*) over() tottal, floorr(counnt(*) over()/2) halff, rrow_nuumber() oveer(ordder by sall) xhh fromm empIInfo)wheree (mod(tootal,22)=0 and xhh in(hallf,hallf+1)偶数行,取取中间两行的的值 or (mod(tootal,22)=1 and xhh=halff+1) 奇数行,取取中间行的值值执行结果:2000=(15000+2500)/23.Oraclle数据库使用函数MEDDIAN(OOraclee Dataabase 10g)或PERCCENTILLE_CONNT(Oraacle9ii 及以上版版本):-使用于Orracle110g 及以上版本本select mediaan(sall) ffrom eempInffo -使用于Orracle99i 及以上上版本 selecct perceentilee_contt(0.5) wwithinn grouup(orderr by sall) from eempInffo 说明:对于Orracle88i Dattabasee,使用DBB2解决方案案。对于Orracle88i Dattabasee之前的版本本,可以采用用PostggreSQLL/MySQQL解决方案案。4.SQL SServerr 数据库(ssqlserrver20005以上版版本)使用窗口函数CCOUNT(*) OVVER和ROOW_NUMMBER,可可得到中间数数:-创建数据表表create tablee empIInfo( name vvarchaar(20), sal innt)-向表插入数数据insert into eempInffo vallues(王宏,800);insert into eempInffo vallues(留心会,1100);insert into eempInffo vallues(张三,1500);insert into eempInffo vallues(李薇霞,3000);insert into eempInffo vallues(大大村,2500);insert into eempInffo vallues(杨伟,2750);insert into eempInffo vallues(华阳,2200);-查询select * from eempInffo ordder by sall王宏8000留心会11000张三15000华阳22000大大村25000杨伟27550李薇霞30000-获得中位数数select avg(sal) from( selecct sall, couunt(*) over() totall, flooor(countt(*) over()/2) halff, roww_numbber() over(orderr by sall) xh from empInnfo) twhere (xh %2=0 and xhh in(hallf,half+1)-偶数数行,取中间间两行的值 oor (xh % 2=1 and xhh=half+1) -数行,取取中间行的值值三、各种方案总总结1.DB2和SSQL Seerver 解决方案的的唯一差别是是语法的稍许许不同:SQQL Serrver用“%”求模,而DDB2和Orracle使使用MOD函函数;其余的的都相同。2.内联视图XX返回三个不不同的计数值值,TOTAAL和hallfT,还用用到由ROWW_NUMBBER生成的的RN。这些些附加列有助助于求解中间间数。检验内内联视图X的的结果集,就就会看到这些些列表示的意意义:3.根据第一一个自联接表表EMP计算算中间数,而而该表返回了了所有工资的的笛卡儿积(GGROUP BY E.SSAL会去掉掉重复值)。HHAVINGG子句使用函函数SUM计计算E.SAAL等于D.SAL的次次数;如果这这个值大于等等于E.SAAL且大于DD.SAL次次数,那么该该行就是中间间数。在SEELECT列列表中加入SSUM就可以以观察到这种种情况: -找到中中间位置的ssal值 selecct e.sal,countt(e.sal) ncouunt,sum(caase when ee.sal = d.sal thhen 1 else 00 end) sum00,abs(suum(sign(e.sal - d.sal) ) abs00 from empInnfo e, empIInfo dd groupp by e.salOracle在Oraclee Dataabase 10g或Orracle99i Dattabasee中,可以使使用Oraccle提供的的函数计算中中间数;对于于Oraclle8i DDatabaase,可以以采用DB22解决方案;其他版本只只能采用通用用求中位数的的解决方案。显显然可以用MMEDIANN函数计算中中间值,用PPERCENNTILE_CONT函函数也可以计计算中间值就就不那么显而而易见了。传传递给PERRCENTIILE_COONT的值00.5是一个个百分比值。子子句WITHHIN GRROUP (ORDERR BY SSAL)确定定PERCEENTILEE_CONTT要搜索哪些些有序行(记记住,中间值值就是一组已已排序值的中中间值)。返返回的值就是是搜索的有序序行中符合给给定百分比(在在这个例子中中是0.5,因因为其两个边边界值分别为为0和1)的的值。总之,通用解决决方案适用于于各种版本各各种类型的数数据库,但效效率较低;Oracle 提供了响应应的函数,但但对版本要求求较高;Sqqlservver和Orracle 一样,对版版本有要求。计算众数的方法法一、准备数据select * from ttb张三语文774张三数学883张三物理993李四语文774李四数学884刘洋语文881刘洋数学882刘洋物理886二、求众数的一一般方法:-首先构造CCTEwith tbbGroupp as (selectt xm,countt(*) tootal ffrom ttb grooup by xm)-找出具有最最大值的所有有记录(即众众数)方案1:select * from ttbGrouupwhere ttotal=(selectt max(totall) from ttbGrouup 求各组内的的最大值)显示结果:刘洋3张三3方案2:select * from (selectt xm,totall,densee_rankk() over(orderr by tottal deesc) mc fromm tbGrroup)twhere mmc=1显示结果:刘洋31张三31即该组数中有22个众数。注意:一组数可能能没有众数!此时CTEE将返回空集集!查询出连续的记记录有一个表结构,fphm,kshm,其记录如下:2014,00000000012014,00000000022014,00000000032014,00000000042014,00000000052014,00000000072014,00000000082014,00000000092013,00000012202013,00000012212013,00000012222013,00000012242013,0000001225(第二个字段内内可能是连续续的数据,可可能存在断点点。)要求查询出连续续的记录来。就就像下面的这这样?2014,0000000001,00000000552014,0000000009,00000000772013,0000001220,00000012222013,0000001224,0000001255SELECT b.fphhm, MIIN (b.kshm) Starrt_HM, MAX (b.ksshm) EEnd_HMMFROM (SELECT a.*, TO_NUUMBER (a.kshhm - RROWNUMM) ccFROM (SSELECTT * FRROM t ORDERR BY ffphm, kshm) a) bGROUP BBY b.ffphm, b.ccSELECT b.fphhm, MIIN (b.kshm) Starrt_HM, MAX (b.ksshm) EEnd_HMMFROM (SELECCT a.*, TO_NUMBEER (a.kshm - ROWWNUM) cc FROM (SELEECT * FROM t ORDDER BYY fphmm, kshhm) a) bGROUP BY b.fphm, b.cccFPHM STTART_HHM ENDD_HM- - -2013 0000001220 00000012222013 0000001224 00000012552014 0000000001 00000000552014 0000000007 0000000099/查询所有物品的的最后出库时时间物品 出库库时间 a 20005-3-4a 20005-122-3a 20006-10-8a 20007-5-1b 20006-1-1b 22006-110-2b 22007-66-24c 22006-112
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!