saillee 发表于 2011-12-22 08:54

利用分析函数在Oracle中分组排序取首条或末条记录行

&nbsp; &nbsp; 在工作中,我们经常会使用到按时间或指定字段进行排序,并提取首条/末条记录的操作,而Oracle中的分析函数让我们能够方便快捷地实现这个功能,下面实例的详细情况:<div><br></div><div>1、建立测试数据表</div><div><br></div><div><div id="codeText" class="codeText"><ol start="1" class="dp-css"><li><span style="color:#0000FF;">create</span> <span style="color:#0000FF;">table</span> sail_test<br></li><li>
<span style="color:#0000CC;">(</span>group_id <span style="color:#0000FF;">number</span><span style="color:#0000CC;">(</span>3<span style="color:#0000CC;">)</span><span style="color:#0000CC;">,</span><br></li><li>
&nbsp;order_id <span style="color:#0000FF;">number</span><span style="color:#0000CC;">(</span>3<span style="color:#0000CC;">)</span><span style="color:#0000CC;">,</span><br></li><li>
&nbsp;other1 <span style="color:#0000FF;">varchar2</span><span style="color:#0000CC;">(</span>8<span style="color:#0000CC;">)</span><span style="color:#0000CC;">,</span><br></li><li>
&nbsp;other2 <span style="color:#0000FF;">varchar2</span><span style="color:#0000CC;">(</span>8<span style="color:#0000CC;">)</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span></li></ol></div></div><div>2、插入测试数据</div><div><br></div><div><div id="codeText" class="codeText"><ol start="1" class="dp-css"><li><span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>1<span style="color:#0000CC;">,</span> 1<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o11'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o21'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>1<span style="color:#0000CC;">,</span> 2<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o12'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o22'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>1<span style="color:#0000CC;">,</span> 3<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o13'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o23'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>1<span style="color:#0000CC;">,</span> 4<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o14'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g1_o24'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>2<span style="color:#0000CC;">,</span> 1<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g2_o11'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g2_o21'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>2<span style="color:#0000CC;">,</span> 2<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g2_o12'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g2_o22'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>2<span style="color:#0000CC;">,</span> 3<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g2_o13'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g2_o23'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>3<span style="color:#0000CC;">,</span> 1<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g3_o11'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g3_o21'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>3<span style="color:#0000CC;">,</span> 2<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g3_o12'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g3_o22'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> sail_test <span style="color:#0000FF;">values</span> <span style="color:#0000CC;">(</span>3<span style="color:#0000CC;">,</span> 3<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g3_o13'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'g3_o23'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span></li></ol></div></div><div>其中,group_id是分组的字段,order_id是排序字段,下面是所有数据的快照:</div><div><br></div><div><div id="codeText" class="codeText"><ol start="1" class="dp-css"><li>GROUP_ID ORDER_ID OTHER1   OTHER2<br></li><li>
<span style="color:#FF9900;">-------- -------- -------- --------</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1      1 g1_o11   g1_o21<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1      2 g1_o12   g1_o22<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1      3 g1_o13   g1_o23<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1      4 g1_o14   g1_o24<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2      1 g2_o11   g2_o21<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2      2 g2_o12   g2_o22<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2      3 g2_o13   g2_o23<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3      1 g3_o11   g3_o21<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3      2 g3_o12   g3_o22<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3      3 g3_o13   g3_o23</li></ol></div></div><div>3、我们现在想查询出各个group_id中,order_id最小的那个记录行,下面是SQL:</div><div><br></div><div><div id="codeText" class="codeText"><ol start="1" class="dp-css"><li><span style="color:#FF9900;">-- 以group_id分组,按照order_id排序(可以是倒序,order by语句后面加desc,取首条记录</span><br></li><li>
<span style="color:#0000FF;">select</span> <span style="color:#0000FF;">distinct</span> a<span style="color:#0000CC;">.</span>group_id<span style="color:#0000CC;">,</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first_value<span style="color:#0000CC;">(</span>a<span style="color:#0000CC;">.</span>other1<span style="color:#0000CC;">)</span> over <span style="color:#0000CC;">(</span>partition <span style="color:#0000FF;">by</span> a<span style="color:#0000CC;">.</span>group_id <span style="color:#0000FF;">order</span> <span style="color:#0000FF;">by</span> order_id<span style="color:#0000CC;">)</span><span style="color:#0000CC;">,</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first_value<span style="color:#0000CC;">(</span>a<span style="color:#0000CC;">.</span>other2<span style="color:#0000CC;">)</span> over <span style="color:#0000CC;">(</span>partition <span style="color:#0000FF;">by</span> a<span style="color:#0000CC;">.</span>group_id <span style="color:#0000FF;">order</span> <span style="color:#0000FF;">by</span> order_id<span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000FF;">from</span> sail_test a<br></li><li>
<span style="color:#0000FF;">order</span> <span style="color:#0000FF;">by</span> a<span style="color:#0000CC;">.</span>group_id<span style="color:#0000CC;">;</span></li></ol></div></div><div>查询结果为:</div><div><br></div><div><div id="codeText" class="codeText"><ol start="1" class="dp-css"><li>GROUP_ID FIRST_VALUE<span style="color:#0000CC;">(</span>A<span style="color:#0000CC;">.</span>OTHER1<span style="color:#0000CC;">)</span>OVER<span style="color:#0000CC;">(</span>PART FIRST_VALUE<span style="color:#0000CC;">(</span>A<span style="color:#0000CC;">.</span>OTHER2<span style="color:#0000CC;">)</span>OVER<span style="color:#0000CC;">(</span>PART<br></li><li>
<span style="color:#FF9900;">-------- ------------------------------ ------------------------------</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 g1_o11                         g1_o21<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 g2_o11                         g2_o21<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 g3_o11                         g3_o21</li></ol></div></div><div>4、总结</div><div><br></div><div>Oracle中的分析函数使用很方便,在本例子中通过over来指定分组字段和排序字段的范围,通过first_value或last_value函数来获取首条或末条记录字段值,排序可以是顺序或倒序,而distinct则指定获取一条记录行。</div><div><br></div>
页: [1]
查看完整版本: 利用分析函数在Oracle中分组排序取首条或末条记录行