<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[oracle DB]group by 和 partition by的比较]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sun, 24 Jan 2010 06:27:28 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	今天看到一个老兄的问题，<br/>大概如下：<br/>查询出部门的最低工资的userid 号<br/>表结构：<br/><br/>D号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工资&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;部门<br/>userid&nbsp;&nbsp;salary&nbsp;&nbsp; dept<br/>&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br/>&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br/>&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;500&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br/>&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br/><br/>有一个高人给出了一种答案：<br/>SELECT MIN (salary) OVER (PARTITION BY dept ) salary, dept&nbsp;&nbsp; <br/>FROM ss<br/><br/>运行后得到：<br/>1000 1<br/>1000 1<br/>500 2<br/>500 2<br/>楼主那位老兄一看觉得很高深。大叹真是高人阿~<br/>我也觉得这位老兄实在是高啊。<br/><br/>但我仔细研究一下发现那位老兄对PARTITION BY的用法理解并不深刻。并没有解决楼主的问题。<br/>大家请看我修改后的语句<br/>SELECT userid,salary,dept,MIN (salary) OVER (PARTITION BY dept ) salary&nbsp;&nbsp;<br/>FROM ss<br/><br/>运行后的结果：<br/>userid&nbsp;&nbsp; salary&nbsp;&nbsp;dept&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MIN (salary) OVER (PARTITION BY dept ) <br/>1 2000 1 1000<br/>2 1000 1 1000<br/>3 500 2 500<br/>4 1000 2 500<br/><br/>大家看出端倪了吧。<br/>高深的未必适合。<br/><br/>一下是我给出的答案：<br/>SELECT * FROM SS<br/>INNER JOIN (SELECT MIN(SALARY) AS SALARY, DEPT FROM SS GROUP BY DEPT) SS2<br/>USING(SALARY,DEPT)<br/><br/>运行后的结果：<br/>salary&nbsp;&nbsp;dept&nbsp;&nbsp;&nbsp;&nbsp; userid<br/>1000 1 2<br/>500 2 3<br/><br/>由此我想到总结一下group by和partition by的用法<br/>group by是对检索结果的保留行进行单纯分组，一般总爱和聚合函数一块用例如AVG（），COUNT（），max（），main（）等一块用。<br/><br/>partition by虽然也具有分组功能，但同时也具有其他的功能。<br/>它属于oracle的分析用函数。<br/>借用一个勤快人的数据说明一下：<br/><br/>sum()&nbsp;&nbsp; over&nbsp;&nbsp; (PARTITION&nbsp;&nbsp; BY&nbsp;&nbsp; ...)&nbsp;&nbsp; 是一个分析函数。&nbsp;&nbsp; 他执行的效果跟普通的sum&nbsp;&nbsp; ...group&nbsp;&nbsp; by&nbsp;&nbsp; ...不一样，它计算组中表达式的累积和，而不是简单的和。&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;表a，内容如下：&nbsp;&nbsp;<br/>&nbsp;&nbsp;B C D&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 02 1&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 03 2&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 04 3&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 05 4&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 5&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 06 6&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 07 7&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 03 5&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 02 12&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 2&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 23&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;select&nbsp;&nbsp; b,c,sum(d)&nbsp;&nbsp; e&nbsp;&nbsp; from&nbsp;&nbsp; a&nbsp;&nbsp; group&nbsp;&nbsp; by&nbsp;&nbsp; b,c&nbsp;&nbsp;<br/>&nbsp;&nbsp;得到：&nbsp;&nbsp;<br/>&nbsp;&nbsp;B C E&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 30&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 02 13&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 03 7&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 04 3&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 05 4&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 06 6&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 07 7&nbsp;&nbsp;<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;而使用分析函数得到的结果是：&nbsp;&nbsp;<br/>&nbsp;&nbsp;SELECT&nbsp;&nbsp; b,&nbsp;&nbsp; c,&nbsp;&nbsp; d,&nbsp;&nbsp; SUM(d)&nbsp;&nbsp; OVER(PARTITION&nbsp;&nbsp; BY&nbsp;&nbsp; b,c&nbsp;&nbsp; ORDER&nbsp;&nbsp; BY&nbsp;&nbsp; d)&nbsp;&nbsp; e&nbsp;&nbsp; FROM&nbsp;&nbsp; a&nbsp;&nbsp;<br/>&nbsp;&nbsp;B C E&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 2&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 7&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 30&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 02 1&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 02 13&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 03 2&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 03 7&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 04 3&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 05 4&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 06 6&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 07 7&nbsp;&nbsp;<br/>&nbsp;&nbsp;结果不一样，这样看还不是很清楚，我们把d的内容也显示出来就更清楚了：&nbsp;&nbsp;<br/>&nbsp;&nbsp;SELECT&nbsp;&nbsp; b,&nbsp;&nbsp; c,&nbsp;&nbsp; d,SUM(d)&nbsp;&nbsp; OVER(PARTITION&nbsp;&nbsp; BY&nbsp;&nbsp; b,c&nbsp;&nbsp; ORDER&nbsp;&nbsp; BY&nbsp;&nbsp; d)&nbsp;&nbsp; e&nbsp;&nbsp; FROM&nbsp;&nbsp; a&nbsp;&nbsp;<br/>&nbsp;&nbsp;B C D E&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 2 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d=2,sum(d)=2&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 5 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d=5,sum(d)=7&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 01 23 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d=23,sum(d)=30&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 02 1 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c值不同，重新累计&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 02 12 13&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 03 2 2&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 03 5 7&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 04 3 3&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 05 4 4&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 06 6 6&nbsp;&nbsp;<br/>&nbsp;&nbsp;02 07 7 7 
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [oracle DB]group by 和 partition by的比较]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>