﻿<?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-沙罗双树园下的三轮明日-文章分类-SQL查询及优化</title><link>http://www.blogjava.net/mercurymarsx/category/48307.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 31 May 2011 06:02:09 GMT</lastBuildDate><pubDate>Tue, 31 May 2011 06:02:09 GMT</pubDate><ttl>60</ttl><item><title>关于Oracle将小于1的数字to_char后丢掉0的解决办法</title><link>http://www.blogjava.net/mercurymarsx/articles/349682.html</link><dc:creator>天涯浪侠</dc:creator><author>天涯浪侠</author><pubDate>Fri, 06 May 2011 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/mercurymarsx/articles/349682.html</guid><wfw:comment>http://www.blogjava.net/mercurymarsx/comments/349682.html</wfw:comment><comments>http://www.blogjava.net/mercurymarsx/articles/349682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mercurymarsx/comments/commentRss/349682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mercurymarsx/services/trackbacks/349682.html</trackback:ping><description><![CDATA[<p>SQL代码如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">select</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">rtrim</span><span style="color: #000000">(to_char(</span><span style="color: #800000; font-weight: bold">0.11</span><span style="color: #000000">,&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">fm9990.99</span><span style="color: #ff0000">'</span><span style="color: #000000">),&nbsp;</span><span style="color: #ff0000">'</span><span style="color: #ff0000">.</span><span style="color: #ff0000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;dual;</span></div>
其中<br />
0.11为需要to_char的数字<br />
fm去掉字符串前面的空格<br />
9990.99表示4位数字，千位百位十位无数字时不显示[标识9]，个位数[标识0]永久显示，小数没有不显示[标识9]<br />
如果数字位数超过4位则返回结果为####[符号#的个数由原字符串长度决定，比如：12345.01则返回8个#号]<br />
此时需要增加格式化位数以达到目的[如：9999999990.99，表示最大10位整数]<br />
如果需要永久显示两位小数，则用9990.00进行格式化<br />
rtrim(str, '.') 去掉右侧的小数点符号[用于没有小数的整数] 
<img src ="http://www.blogjava.net/mercurymarsx/aggbug/349682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mercurymarsx/" target="_blank">天涯浪侠</a> 2011-05-06 15:35 <a href="http://www.blogjava.net/mercurymarsx/articles/349682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句中的rank () over ， row_number() over ，rank_dense ()</title><link>http://www.blogjava.net/mercurymarsx/articles/341154.html</link><dc:creator>天涯浪侠</dc:creator><author>天涯浪侠</author><pubDate>Mon, 20 Dec 2010 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/mercurymarsx/articles/341154.html</guid><wfw:comment>http://www.blogjava.net/mercurymarsx/comments/341154.html</wfw:comment><comments>http://www.blogjava.net/mercurymarsx/articles/341154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mercurymarsx/comments/commentRss/341154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mercurymarsx/services/trackbacks/341154.html</trackback:ping><description><![CDATA[SQL语句中的rank () over ， row_number() over ，rank_dense ()<br />
<br />
总结如下：<br />
我创建了一个表，数据如下，<br />
SQL&gt; select * from test;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A1 &nbsp;&nbsp; &nbsp;&nbsp; A2<br />
---------- ----------<br />
&nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 2<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 5<br />
&nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2<br />
然后用rank () over，<br />
SQL&gt; select a1,a2,rank () over (order by a1) rank from test;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A1 &nbsp;&nbsp; &nbsp;&nbsp; A2 &nbsp;&nbsp; RANK<br />
---------- ---------- ----------<br />
&nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 1<br />
&nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 5 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 5<br />
SQL&gt; select a1,a2,rank () over (order by a2) rank from test;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A1 &nbsp;&nbsp; &nbsp;&nbsp; A2 &nbsp;&nbsp; RANK<br />
---------- ---------- ----------<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 1<br />
&nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 1<br />
&nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 4<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 5 &nbsp;&nbsp; &nbsp;&nbsp; 5<br />
原来这个就是用来看排名的东东啊。<br />
接下来看看row_number() over，<br />
SQL&gt; select a1,a2, row_number () over (order by a1) rank from test;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A1 &nbsp;&nbsp; &nbsp;&nbsp; A2 &nbsp;&nbsp; RANK<br />
---------- ---------- ----------<br />
&nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 1<br />
&nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 5 &nbsp;&nbsp; &nbsp;&nbsp; 4<br />
&nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 5<br />
SQL&gt; select a1,a2, row_number () over (order by a2) rank from test;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A1 &nbsp;&nbsp; &nbsp;&nbsp; A2 &nbsp;&nbsp; RANK<br />
---------- ---------- ----------<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 1<br />
&nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 2<br />
&nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 4<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 5 &nbsp;&nbsp; &nbsp;&nbsp; 5<br />
再看看dense_rank () over<br />
SQL&gt; select a1,a2, dense_rank () over (order by a1) rank from test;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A1 &nbsp;&nbsp; &nbsp;&nbsp; A2 &nbsp;&nbsp; RANK<br />
---------- ---------- ----------<br />
&nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 1<br />
&nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 5 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4<br />
dense_rank在有出现相同的rank后，rank的值是紧接上一次的rank值。<br />
可以这么理解，我们通常意义上的top N 的实现应该采用row_number() over 而不是rank () over，因为row_number 是给记录加一个序号标记，而rank 是相当于进行排序后的排名，也就是如果排序列是相同的，那么他们的返回值也是相同的，而row_number则不可能返回相同值。<br />
放到一起看看吧：<br />
<br />
SQL&gt;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">select&nbsp;a1,a2,<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />rank&nbsp;()&nbsp;over&nbsp;(order&nbsp;by&nbsp;a1)&nbsp;rank,<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />dense_rank&nbsp;()&nbsp;over&nbsp;(order&nbsp;by&nbsp;a1)&nbsp;dense_rank,<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />row_number&nbsp;()&nbsp;over&nbsp;(order&nbsp;by&nbsp;a1)&nbsp;row_number<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />from&nbsp;test;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A1 &nbsp;&nbsp; &nbsp;&nbsp; A2 &nbsp;&nbsp; RANK DENSE_RANK ROW_NUMBER<br />
---------- ---------- ---------- ---------- ----------<br />
&nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 1 &nbsp;&nbsp; &nbsp;&nbsp; 1<br />
&nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 2<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 3<br />
&nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 5 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 3 &nbsp;&nbsp; &nbsp;&nbsp; 4<br />
&nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 2 &nbsp;&nbsp; &nbsp;&nbsp; 5 &nbsp;&nbsp; &nbsp;&nbsp; 4 &nbsp;&nbsp; &nbsp;&nbsp; 5<br />
row_number()和rownum差不多，功能更强一点（可以在各个分组内从1开时排序）．<br />
rank()是跳跃排序，有两个第二名时接下来就是第四名（同样是在各个分组内）．<br />
dense_rank()l是连续排序，有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的．<br />
  <img src ="http://www.blogjava.net/mercurymarsx/aggbug/341154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mercurymarsx/" target="_blank">天涯浪侠</a> 2010-12-20 13:45 <a href="http://www.blogjava.net/mercurymarsx/articles/341154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>