﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Be alaways javaing...-随笔分类-Database</title><link>http://www.blogjava.net/byrtiger/category/32560.html</link><description>Loving Java</description><language>zh-cn</language><lastBuildDate>Tue, 08 Jul 2008 09:30:18 GMT</lastBuildDate><pubDate>Tue, 08 Jul 2008 09:30:18 GMT</pubDate><ttl>60</ttl><item><title>Oracle中取出给定数据集中出现最频繁的元素</title><link>http://www.blogjava.net/byrtiger/archive/2008/07/08/213286.html</link><dc:creator>追风舞者</dc:creator><author>追风舞者</author><pubDate>Tue, 08 Jul 2008 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/byrtiger/archive/2008/07/08/213286.html</guid><wfw:comment>http://www.blogjava.net/byrtiger/comments/213286.html</wfw:comment><comments>http://www.blogjava.net/byrtiger/archive/2008/07/08/213286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byrtiger/comments/commentRss/213286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byrtiger/services/trackbacks/213286.html</trackback:ping><description><![CDATA[1.&nbsp;&nbsp;<span style="color: #ff0000">&nbsp;<span style="color: #3366ff">select * from emp;</span></span><br />
<br />
&nbsp;&nbsp;&nbsp; EMPNO ENAME&nbsp; JOB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MGR HIREDATE&nbsp;&nbsp;&nbsp;&nbsp; SAL COMM&nbsp; DEPTNO<br />
&nbsp;&nbsp;&nbsp; ----- ------ --------- ---- ----------- ---- ---- -------<br />
&nbsp;&nbsp;&nbsp; &nbsp;7369 SMITH&nbsp; CLERK&nbsp;&nbsp;&nbsp;&nbsp; 7902 17-DEC-1980&nbsp; 800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />
&nbsp;&nbsp;&nbsp; &nbsp;7499 ALLEN&nbsp; SALESMAN&nbsp; 7698 20-FEB-1981 1600&nbsp; 300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />
&nbsp;&nbsp;&nbsp; &nbsp;7521 WARD&nbsp;&nbsp; SALESMAN&nbsp; 7698 22-FEB-1981 1250&nbsp; 500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />
&nbsp;&nbsp;&nbsp; &nbsp;7566 JONES&nbsp; MANAGER&nbsp;&nbsp; 7839 02-APR-1981 2975&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />
&nbsp;&nbsp;&nbsp; &nbsp;7654 MARTIN SALESMAN&nbsp; 7698 28-SEP-1981 1250 1400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />
&nbsp;&nbsp;&nbsp; &nbsp;7698 BLAKE&nbsp; MANAGER&nbsp;&nbsp; 7839 01-MAY-1981 2850&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />
&nbsp;&nbsp;&nbsp; &nbsp;7782 CLARK&nbsp; MANAGER&nbsp;&nbsp; 7839 09-JUN-1981 2450&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />
&nbsp;&nbsp;&nbsp; &nbsp;7788 SCOTT&nbsp; ANALYST&nbsp;&nbsp; 7566 09-DEC-1982 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />
&nbsp;&nbsp;&nbsp; &nbsp;7839 KING&nbsp;&nbsp; PRESIDENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17-NOV-1981 5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />
&nbsp;&nbsp;&nbsp; &nbsp;7844 TURNER SALESMAN&nbsp; 7698 08-SEP-1981 1500&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />
&nbsp;&nbsp;&nbsp; &nbsp;7876 ADAMS&nbsp; CLERK&nbsp;&nbsp;&nbsp;&nbsp; 7788 12-JAN-1983 1100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />
&nbsp;&nbsp;&nbsp; &nbsp;7900 JAMES&nbsp; CLERK&nbsp;&nbsp;&nbsp;&nbsp; 7698 03-DEC-1981&nbsp; 950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30<br />
&nbsp;&nbsp;&nbsp; &nbsp;7902 FORD&nbsp;&nbsp; ANALYST&nbsp;&nbsp; 7566 03-DEC-1981 3000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20<br />
&nbsp;&nbsp;&nbsp; &nbsp;7934 MILLER CLERK&nbsp;&nbsp;&nbsp;&nbsp; 7782 23-JAN-1982 1300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br />
<br />
2.<span style="color: #ff0000">问题：查找DEPTNO 20中出现最多次数的工资？</span><br />
<span style="color: #ff0000">&nbsp;<span style="color: #00ccff"><span style="color: #3366ff">select sal<br />
&nbsp;&nbsp;&nbsp; &nbsp; from emp<br />
&nbsp;&nbsp;&nbsp; &nbsp;where deptno = 20<br />
&nbsp;&nbsp;&nbsp; &nbsp;order by sal<br />
</span></span></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL<br />
&nbsp;&nbsp;&nbsp; ----------<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2975<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000<br />
<br />
3.解决方案<br />
使用窗口函数 DENSE_RANK,把工资重复出现的次数分等级。<br />
&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select sal<br />
&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from (<br />
&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select sal,<br />
&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dense_rank()over( order by cnt desc) as rnk<br />
&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from (<br />
&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select sal, count(*) as cnt<br />
&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from emp<br />
&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where deptno = 20<br />
&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group by sal<br />
&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) x<br />
&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) y<br />
&nbsp;13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where rnk = 1&nbsp;<br />
<img src ="http://www.blogjava.net/byrtiger/aggbug/213286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byrtiger/" target="_blank">追风舞者</a> 2008-07-08 11:55 <a href="http://www.blogjava.net/byrtiger/archive/2008/07/08/213286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQl中关于空值NULL</title><link>http://www.blogjava.net/byrtiger/archive/2008/07/08/213252.html</link><dc:creator>追风舞者</dc:creator><author>追风舞者</author><pubDate>Tue, 08 Jul 2008 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/byrtiger/archive/2008/07/08/213252.html</guid><wfw:comment>http://www.blogjava.net/byrtiger/comments/213252.html</wfw:comment><comments>http://www.blogjava.net/byrtiger/archive/2008/07/08/213252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byrtiger/comments/commentRss/213252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byrtiger/services/trackbacks/213252.html</trackback:ping><description><![CDATA[1.ISNULL 判断某一字段是否为空，若为空返回 TRUE，否则返回 FALSE<span style="color: red;"></span><br />
<br />
2.NULLIF（字段名，字段值）若字段名的值为"字段值"，则将该字段值替换成NULL<br />
<br />
3.COALESCE(表达式1，表达式2，...表达式n） 从左到右 依次判断表达式的值,返回第一个非空的表达式的值。<br />
<br />
<img src ="http://www.blogjava.net/byrtiger/aggbug/213252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byrtiger/" target="_blank">追风舞者</a> 2008-07-08 10:43 <a href="http://www.blogjava.net/byrtiger/archive/2008/07/08/213252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle日期函数</title><link>http://www.blogjava.net/byrtiger/archive/2008/07/04/212506.html</link><dc:creator>追风舞者</dc:creator><author>追风舞者</author><pubDate>Fri, 04 Jul 2008 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/byrtiger/archive/2008/07/04/212506.html</guid><wfw:comment>http://www.blogjava.net/byrtiger/comments/212506.html</wfw:comment><comments>http://www.blogjava.net/byrtiger/archive/2008/07/04/212506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byrtiger/comments/commentRss/212506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byrtiger/services/trackbacks/212506.html</trackback:ping><description><![CDATA[Oracle的日期函数:<br />
<br />
Oracle从8i开始就提供了大量的日期函数，这些日期函数包括对日期进行加减、转换、截取等功能。下面是Oracle提供的日期函数一览表&nbsp;
<table style="width: 100%" cellspacing="0" cellpadding="0" width="100%" border="1">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: center" align="center"><strong><span style="font-family: Verdana">Function</span></strong></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: center" align="center"><strong><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Use</span></span></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">ADD_MONTHS</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Adds months to a date</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">LAST_DAY</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Computes the last day of the month</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">MONTHS_BETWEEN</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Determines the number of months between two dates</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">NEW_TIME</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Translates a time to a new time zone</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">NEXT_DAY</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Returns the date of the next specified weekday </span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">ROUND</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Rounds a date/time value to a specified element</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">SYSDATE</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Returns the current date and time</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">TO_CHAR</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Converts dates to strings</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">TO_DATE</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Converts strings and numbers to dates</span></span></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">TRUNC</span></span></span></p>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p><span style="font-family: Verdana"><span style="font-size: 12pt"><span style="font-size: 10pt">Truncates a date/time value to a specific element</span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
更多详细内容请参考：<a href="http://www.blogjava.net/pengpenglin/archive/2008/06/30/211589.html">http://www.blogjava.net/pengpenglin/archive/2008/06/30/211589.html</a>
<img src ="http://www.blogjava.net/byrtiger/aggbug/212506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byrtiger/" target="_blank">追风舞者</a> 2008-07-04 10:32 <a href="http://www.blogjava.net/byrtiger/archive/2008/07/04/212506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle分析函数(二)</title><link>http://www.blogjava.net/byrtiger/archive/2008/07/04/212463.html</link><dc:creator>追风舞者</dc:creator><author>追风舞者</author><pubDate>Thu, 03 Jul 2008 16:12:00 GMT</pubDate><guid>http://www.blogjava.net/byrtiger/archive/2008/07/04/212463.html</guid><wfw:comment>http://www.blogjava.net/byrtiger/comments/212463.html</wfw:comment><comments>http://www.blogjava.net/byrtiger/archive/2008/07/04/212463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byrtiger/comments/commentRss/212463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byrtiger/services/trackbacks/212463.html</trackback:ping><description><![CDATA[<p>Oracle分析函数(二)<br />
<br />
1.AVG <br />
功能描述：用于计算一个组和数据窗口内表达式的平均值。<br />
SAMPLE：下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告，该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来； </p>
<p>SELECT manager_id, last_name, hire_date, salary,<br />
<strong>AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date <br />
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) </strong>AS c_mavg<br />
FROM employees; </p>
<p>MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG<br />
---------- ------------------------- --------- ---------- ----------<br />
100 Kochhar 21-SEP-89 17000 17000<br />
100 De Haan 13-JAN-93 17000 15000<br />
100 Raphaely 07-DEC-94 11000 11966.6667<br />
100 Kaufling 01-MAY-95 7900 10633.3333<br />
100 Hartstein 17-FEB-96 13000 9633.33333<br />
100 Weiss 18-JUL-96 8000 11666.6667<br />
100 Russell 01-OCT-96 14000 11833.3333 <br />
</p>
<p><br />
2.COUNT <br />
功能描述：对一组内发生的事情进行累积计数，如果指定*或一些非空常数，count将对所有行计数，如果指定一个表达式，count返回表达式非空赋值的计数，当有相同值出现时，这些相等的值都会被纳入被计算的值；可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。<br />
SAMPLE：下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数，n表示当前行的薪水例如，Philtanker的薪水2200，排在他之前的行中薪水大于等于2200-50的有1行，排在他之后的行中薪水小于等于2200＋150的行没有，所以count计数值cnt3为2（包括自己当前行）；cnt2值相当于小于等于当前行的SALARY值的所有行数 </p>
<p>SELECT last_name, salary, COUNT(*) OVER () AS cnt1,<br />
COUNT(*) OVER (ORDER BY salary) AS cnt2,<br />
COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING<br />
AND 150 FOLLOWING) AS cnt3 FROM employees; </p>
<p>LAST_NAME SALARY CNT1 CNT2 CNT3<br />
------------------------- ---------- ---------- ---------- ----------<br />
Olson 2100 107 1 3<br />
Markle 2200 107 3 2<br />
Philtanker 2200 107 3 2<br />
Landry 2400 107 5 8<br />
Gee 2400 107 5 8<br />
Colmenares 2500 107 11 10<br />
Patel 2500 107 11 10<br />
<br />
</p>
<p>3.DENSE_RANK <br />
功能描述：根据ORDER BY子句中表达式的值，从查询返回的每一行，计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序，然后给每一行赋一个号，从而形成一个序列，该序列从1开始，往后累加。每次ORDER BY表达式的值发生变化时，该序列也随之增加。有同样值的行得到同样的数字序号（认为null时相等的）。密集的序列返回的时没有间隔的数<br />
SAMPLE：下例中计算每个员工按部门分区再按薪水排序，依次出现的序列号（注意与RANK函数的区别） </p>
<p>SELECT d.department_id , e.last_name, e.salary, DENSE_RANK() <br />
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank<br />
FROM employees e, departments d<br />
WHERE e.department_id = d.department_id<br />
AND d.department_id IN ('60', '90'); </p>
<p>DEPARTMENT_ID LAST_NAME SALARY DRANK<br />
------------- ------------------------- ---------- ----------<br />
60 Lorentz 4200 1<br />
60 Austin 4800 2<br />
60 Pataballa 4800 2<br />
60 Ernst 6000 3<br />
60 Hunold 9000 4<br />
90 Kochhar 17000 1<br />
90 De Haan 17000 1<br />
90 King 24000 2 </p>
<p>&nbsp;RANK()与DENSE_RANK()用法相当，但是有一个区别：DENSE_RANK在处理相同的等级时，等级的数值不会跳过,RANK()则跳过。<br />
</p>
<p>&nbsp; RANK <br />
功能描述：根据ORDER BY子句中表达式的值，从查询返回的每一行，计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序，然后给每一行赋一个号，从而形成一个序列，该序列从1开始，往后累加。每次ORDER BY表达式的值发生变化时，该序列也随之增加。有同样值的行得到同样的数字序号（认为null时相等的）。然而，如果两行的确得到同样的排序，则序数将随后跳跃。若两行序数为1，则没有序数2，序列将给组中的下一行分配值3，DENSE_RANK则没有任何跳跃。<br />
SAMPLE：下例中计算每个员工按部门分区再按薪水排序，依次出现的序列号（注意与DENSE_RANK函数的区别） </p>
<p>SELECT d.department_id , e.last_name, e.salary, RANK() <br />
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank<br />
FROM employees e, departments d<br />
WHERE e.department_id = d.department_id<br />
AND d.department_id IN ('60', '90'); </p>
<p>DEPARTMENT_ID LAST_NAME SALARY DRANK<br />
------------- ------------------------- ---------- ----------<br />
60 Lorentz 4200 1<br />
60 Austin 4800 2<br />
60 Pataballa 4800 2<br />
60 Ernst 6000 4<br />
60 Hunold 9000 5<br />
90 Kochhar 17000 1<br />
90 De Haan 17000 1<br />
90 King 24000 3 <br />
<br />
4.FIRST <br />
功能描述：从DENSE_RANK返回的集合中取出排在最前面的一个值的行（可能多行，因为值可能相等），因此完整的语法需要在开始处加上一个集合函数以从中取出记录SAMPLE.<br />
下面例子中DENSE_RANK按部门分区，再按佣金commission_pct排序，FIRST取出佣金最低的对应的所有行，然后前面的MAX函数从这个集合中取出薪水最低的值；LAST取出佣金最高的对应的所有行，然后前面的MIN函数从这个集合中取出薪水最高的值.<br />
SELECT last_name, department_id, salary,<br />
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Worst",<br />
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Best"<br />
FROM employees <br />
WHERE department_id in (20,80) <br />
ORDER BY department_id, salary;</p>
<p>LAST_NAME DEPARTMENT_ID SALARY Worst Best<br />
------------------------- ------------- ---------- ---------- ----------<br />
Fay 20 6000 6000 13000<br />
Hartstein 20 13000 6000 13000<br />
Kumar 80 6100 6100 14000<br />
Banda 80 6200 6100 14000<br />
Johnson 80 6200 6100 14000<br />
Ande 80 6400 6100 14000<br />
Lee 80 6800 6100 14000<br />
Tuvault 80 7000 6100 14000<br />
Sewall 80 7000 6100 14000<br />
Marvins 80 7200 6100 14000<br />
Bates 80 7300 6100 14000<br />
<br />
</p>
<p><br />
5.FIRST_VALUE <br />
功能描述：返回组中数据窗口的第一个值。<br />
SAMPLE：下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的名字，如果薪水的第一个值有多个，则从多个对应的名字中取缺省排序的第一个名字 </p>
<p>SELECT department_id, last_name, salary, FIRST_VALUE(last_name)<br />
OVER (PARTITION BY department_id ORDER BY salary ASC ) AS lowest_sal<br />
FROM employees <br />
WHERE department_id in(20,30); </p>
<p>DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL<br />
------------- ------------------------- ---------- --------------<br />
20 Fay 6000 Fay<br />
20 Hartstein 13000 Fay<br />
30 Colmenares 2500 Colmenares<br />
30 Himuro 2600 Colmenares<br />
30 Tobias 2800 Colmenares<br />
30 Baida 2900 Colmenares<br />
30 Khoo 3100 Colmenares<br />
30 Raphaely 11000 Colmenares </p>
<p>6.LAST <br />
功能描述：从DENSE_RANK返回的集合中取出排在最后面的一个值的行（可能多行，因为值可能相等），因此完整的语法需要在开始处加上一个集合函数以从中取出记录<br />
SAMPLE：下面例子中DENSE_RANK按部门分区，再按佣金commission_pct排序，FIRST取出佣金最低的对应的所有行，然后前面的MAX函数从这个集合中取出薪水最低的值；LAST取出佣金最高的对应的所有行，然后前面的MIN函数从这个集合中取出薪水最高的值<br />
SELECT last_name, department_id, salary,<br />
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Worst",<br />
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)<br />
OVER (PARTITION BY department_id) "Best"<br />
FROM employees <br />
WHERE department_id in (20,80) <br />
ORDER BY department_id, salary; </p>
<p>LAST_NAME DEPARTMENT_ID SALARY Worst Best<br />
------------------------- ------------- ---------- ---------- ----------<br />
Fay 20 6000 6000 13000<br />
Hartstein 20 13000 6000 13000<br />
Kumar 80 6100 6100 14000<br />
Banda 80 6200 6100 14000<br />
Johnson 80 6200 6100 14000<br />
Ande 80 6400 6100 14000<br />
Lee 80 6800 6100 14000<br />
Tuvault 80 7000 6100 14000<br />
Sewall 80 7000 6100 14000<br />
Marvins 80 7200 6100 14000<br />
Bates 80 7300 6100 14000</p>
<p>7.LAST_VALUE <br />
功能描述：返回组中数据窗口的最后一个值。<br />
SAMPLE：下面例子计算按部门分区按薪水排序的数据窗口的最后一个值对应的名字，如果薪水的最后一个值有多个，则从多个对应的名字中取缺省排序的最后一个名字<br />
SELECT department_id, last_name, salary, LAST_VALUE(last_name)<br />
OVER(PARTITION BY department_id ORDER BY salary) AS highest_sal<br />
FROM employees <br />
WHERE department_id in(20,30); </p>
<p>DEPARTMENT_ID LAST_NAME SALARY HIGHEST_SAL<br />
------------- ------------------------- ---------- ------------<br />
20 Fay 6000 Fay<br />
20 Hartstein 13000 Hartstein<br />
30 Colmenares 2500 Colmenares<br />
30 Himuro 2600 Himuro<br />
30 Tobias 2800 Tobias<br />
30 Baida 2900 Baida<br />
30 Khoo 3100 Khoo<br />
30 Raphaely 11000 Raphaely <br />
</p>
<p>8.LAG <br />
功能描述：可以访问结果集中的其它行而不用进行自连接。它允许去处理游标，就好像游标是一个数组一样。在给定组中可参考当前行之前的行，这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数，其默认值为1，若索引超出窗口的范围，就返回默认值（默认返回的是组中第一行），其相反的函数是LEAD<br />
SAMPLE：下面的例子中列prev_sal返回按hire_date排序的前1行的salary值 </p>
<p>SELECT last_name, hire_date, salary,<br />
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal<br />
FROM employees<br />
WHERE job_id = 'PU_CLERK'; </p>
<p>LAST_NAME HIRE_DATE SALARY PREV_SAL<br />
------------------------- ---------- ---------- ----------<br />
Khoo 18-5月 -95 3100 0<br />
Tobias 24-7月 -97 2800 3100<br />
Baida 24-12月-97 2900 2800<br />
Himuro 15-11月-98 2600 2900<br />
Colmenares 10-8月 -99 2500 2600 <br />
</p>
<p>9.LEAD <br />
功能描述：LEAD与LAG相反，LEAD可以访问组中当前行之后的行。Offset是一个正整数，其默认值为1，若索引超出窗口的范围，就返回默认值（默认返回的是组中第一行）<br />
SAMPLE：下面的例子中每行的"NextHired"返回按hire_date排序的下一行的hire_date值 </p>
<p>SELECT last_name, hire_date, <br />
LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired" <br />
FROM employees WHERE department_id = 30; </p>
<p>LAST_NAME HIRE_DATE NextHired<br />
------------------------- --------- ---------<br />
Raphaely 07-DEC-94 18-MAY-95<br />
Khoo 18-MAY-95 24-JUL-97<br />
Tobias 24-JUL-97 24-DEC-97<br />
Baida 24-DEC-97 15-NOV-98<br />
Himuro 15-NOV-98 10-AUG-99<br />
Colmenares 10-AUG-99 <br />
<br />
</p>
<p>10.SUM <br />
功能描述：该函数计算组中表达式的累积和。<br />
SAMPLE：下例计算同一经理下员工的薪水累积值 </p>
<p>SELECT manager_id, last_name, salary,<br />
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary<br />
RANGE UNBOUNDED PRECEDING) l_csum<br />
FROM employees<br />
WHERE manager_id in (101,103,108); </p>
<p>MANAGER_ID LAST_NAME SALARY L_CSUM<br />
---------- ------------------------- ---------- ----------<br />
101 Whalen 4400 4400<br />
101 Mavris 6500 10900<br />
101 Baer 10000 20900<br />
101 Greenberg 12000 44900<br />
101 Higgins 12000 44900<br />
103 Lorentz 4200 4200<br />
103 Austin 4800 13800<br />
103 Pataballa 4800 13800<br />
103 Ernst 6000 19800<br />
108 Popp 6900 6900<br />
108 Sciarra 7700 14600<br />
108 Urman 7800 22400<br />
108 Chen 8200 30600<br />
108 Faviet 9000 39600</p>
<p>11.MAX <br />
功能描述：在一个组中的数据窗口中查找表达式的最大值。<br />
SAMPLE：下面例子中dept_max返回当前行所在部门的最大薪水值 </p>
<p>SELECT department_id, last_name, salary, <br />
MAX(salary) OVER (PARTITION BY department_id) AS dept_max<br />
FROM employees WHERE department_id in (10,20,30); </p>
<p>DEPARTMENT_ID LAST_NAME SALARY DEPT_MAX<br />
------------- ------------------------- ---------- ----------<br />
10 Whalen 4400 4400<br />
20 Hartstein 13000 13000<br />
20 Fay 6000 13000<br />
30 Raphaely 11000 11000<br />
30 Khoo 3100 11000<br />
30 Baida 2900 11000<br />
30 Tobias 2800 11000<br />
30 Himuro 2600 11000<br />
30 Colmenares 2500 11000 </p>
<p>12.MIN <br />
功能描述：在一个组中的数据窗口中查找表达式的最小值。<br />
SAMPLE：下面例子中dept_min返回当前行所在部门的最小薪水值 </p>
<p>SELECT department_id, last_name, salary, <br />
MIN(salary) OVER (PARTITION BY department_id) AS dept_min<br />
FROM employees WHERE department_id in (10,20,30); </p>
<p>DEPARTMENT_ID LAST_NAME SALARY DEPT_MIN<br />
------------- ------------------------- ---------- ----------<br />
10 Whalen 4400 4400<br />
20 Hartstein 13000 6000<br />
20 Fay 6000 6000<br />
30 Raphaely 11000 2500<br />
30 Khoo 3100 2500<br />
30 Baida 2900 2500<br />
30 Tobias 2800 2500<br />
30 Himuro 2600 2500<br />
30 Colmenares 2500 2500 <br />
</p>
<img src ="http://www.blogjava.net/byrtiger/aggbug/212463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byrtiger/" target="_blank">追风舞者</a> 2008-07-04 00:12 <a href="http://www.blogjava.net/byrtiger/archive/2008/07/04/212463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle分析函数(一）</title><link>http://www.blogjava.net/byrtiger/archive/2008/07/04/212461.html</link><dc:creator>追风舞者</dc:creator><author>追风舞者</author><pubDate>Thu, 03 Jul 2008 16:10:00 GMT</pubDate><guid>http://www.blogjava.net/byrtiger/archive/2008/07/04/212461.html</guid><wfw:comment>http://www.blogjava.net/byrtiger/comments/212461.html</wfw:comment><comments>http://www.blogjava.net/byrtiger/archive/2008/07/04/212461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byrtiger/comments/commentRss/212461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byrtiger/services/trackbacks/212461.html</trackback:ping><description><![CDATA[<p>&nbsp;窗口函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle从8.1.6开始提供分析函数，分析函数用于计算基于组的某种聚合值，它和聚合函数的不同之处是对于每个组返回多行，而聚合函数对于每个组只返回一行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;开窗函数指定了分析函数工作的数据窗口大小，这个数据窗口大小可能会随着行的变化而变化，举例如下：<br />
1)&nbsp;over(order by salary)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按照salary排序进行累计，order by是个默认的开窗函数<br />
2) over(partition by deptno)<br />
&nbsp;&nbsp;&nbsp; &nbsp;按照部门分区<br />
3) over(order by salary range between 50 preceding and 150 following)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每行对应的数据窗口是之前行幅度值不超过50，之后行幅度值不超过150<br />
4) over(order by salary rows between 50 preceding and 150 following)<br />
&nbsp;&nbsp;&nbsp;&nbsp;每行对应的数据窗口是之前50行，之后150行<br />
5) over(order by salary rows between unbounded preceding and unbounded following)<br />
&nbsp;&nbsp;&nbsp; &nbsp;每行对应的数据窗口是从第一行到最后一行，等效：<br />
&nbsp;&nbsp;&nbsp;&nbsp;over(order by salary range between unbounded preceding and unbounded following)<br />
</p>
<img src ="http://www.blogjava.net/byrtiger/aggbug/212461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byrtiger/" target="_blank">追风舞者</a> 2008-07-04 00:10 <a href="http://www.blogjava.net/byrtiger/archive/2008/07/04/212461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表中随机返回n条记录</title><link>http://www.blogjava.net/byrtiger/archive/2008/07/03/212454.html</link><dc:creator>追风舞者</dc:creator><author>追风舞者</author><pubDate>Thu, 03 Jul 2008 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/byrtiger/archive/2008/07/03/212454.html</guid><wfw:comment>http://www.blogjava.net/byrtiger/comments/212454.html</wfw:comment><comments>http://www.blogjava.net/byrtiger/archive/2008/07/03/212454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byrtiger/comments/commentRss/212454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byrtiger/services/trackbacks/212454.html</trackback:ping><description><![CDATA[1.MySQL<br />
&nbsp;&nbsp;&nbsp; 同时使用内置RAND函数、LIMIT函数和ORDER BY<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select * from table<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by rand()&nbsp; limit 5<br />
2.Oracle<br />
&nbsp;&nbsp;&nbsp;&nbsp;同时使用DBMS_RANDOM包中的内置函数 VALUE、 ORDER BY和内置函数ROWNUM<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select * from(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select name from table order by dbms_random.value()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;) where rownum &lt;=5 
 <img src ="http://www.blogjava.net/byrtiger/aggbug/212454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byrtiger/" target="_blank">追风舞者</a> 2008-07-03 23:08 <a href="http://www.blogjava.net/byrtiger/archive/2008/07/03/212454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不同数据库中的日期操作</title><link>http://www.blogjava.net/byrtiger/archive/2008/07/03/212451.html</link><dc:creator>追风舞者</dc:creator><author>追风舞者</author><pubDate>Thu, 03 Jul 2008 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/byrtiger/archive/2008/07/03/212451.html</guid><wfw:comment>http://www.blogjava.net/byrtiger/comments/212451.html</wfw:comment><comments>http://www.blogjava.net/byrtiger/archive/2008/07/03/212451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byrtiger/comments/commentRss/212451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byrtiger/services/trackbacks/212451.html</trackback:ping><description><![CDATA[<p>1.Oracle<br />
&nbsp;&nbsp;&nbsp; 对天数采用标准加减，使用ADD_MONTHS函数加减月数和年数</p>
&nbsp;&nbsp;&nbsp;例如 1)insertDate是数据库表中的一个日期类型的字段<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 则 insertDate-5为前五天，同理insertDate+5为后五天<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) 若要获得前一个月的时间，则 add_months(insertDate,-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若要获得后一个月的时间，则 add_months(insertDate,1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)若要获得前一年的时间，则 add_months(insetDate,-1*12)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若要获得后一年的时间，则 add_months(insetDate, 1*12)<br />
2.MySQL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同时使用标准加减和INTERVAL关键字，INTEVRAL 指定时间单位<br />
&nbsp;&nbsp; 例如：insertDate - INTERVAL 1 day<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insertDate + INTERVAL 1 day<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insertDate - INTERVAL 1 month<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertDate - INTERVAL 1 year<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也可使用DATE_ADD(),ADDDATE(),SUBDATE()函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE_ADD(insertDate,INTERVAL 5&nbsp; day)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE_ADD(insertDate,INTERVAL -5&nbsp; day)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADDDATE(),SUBDATE() 使用方法类似 
<img src ="http://www.blogjava.net/byrtiger/aggbug/212451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byrtiger/" target="_blank">追风舞者</a> 2008-07-03 22:59 <a href="http://www.blogjava.net/byrtiger/archive/2008/07/03/212451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>