<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-4656928825788854821</atom:id><lastBuildDate>Tue, 03 Feb 2009 22:34:25 +0000</lastBuildDate><title>Warfield Consulting Blog</title><description></description><link>http://blog.warfieldconsulting.com/</link><managingEditor>noreply@blogger.com (Tom Warfield)</managingEditor><generator>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4656928825788854821.post-438494784066404976</guid><pubDate>Mon, 26 Jan 2009 13:48:00 +0000</pubDate><atom:updated>2009-02-03T17:19:18.404-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>non-deterministic</category><category domain='http://www.blogger.com/atom/ns#'>Election</category><category domain='http://www.blogger.com/atom/ns#'>Ranking</category><category domain='http://www.blogger.com/atom/ns#'>Analytic</category><category domain='http://www.blogger.com/atom/ns#'>Windowing</category><category domain='http://www.blogger.com/atom/ns#'>Dominant</category><category domain='http://www.blogger.com/atom/ns#'>SQL</category><category domain='http://www.blogger.com/atom/ns#'>Popularity</category><title>The "Popularity Problem": An Application of SQL Analytic Ranking Functions (Part 1)</title><description>&lt;span style="font-style: italic;font-family:georgia;" &gt;This is the first in a series of occasional articles on SQL features and coding techniques.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;A situation that comes up frequently in my work is the selection of a "primary" or "dominant" attribute for an individual or group. Some examples are:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:georgia;"&gt;Find the most popular magazine subscription in a ZIP code&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:georgia;"&gt;Identify a store where a customer spends the most money&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:georgia;"&gt;Who won the election?&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:georgia;"&gt;In these examples, there is a one-to-many relationship that we want to convert into a one-to-one relationship. We start with a data set having a grain of one-to-many, and we want to reduce this by selecting the most popular choice. In this article, I'll discuss some variations on the problem, how to do it in SQL the "hard way", and how to use SQL Ranking functions to get to the solution easily.&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;font-size:130%;font-weight: bold;" &gt;A Simple Case - Who won the Election?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's start with the simplest variant of the problem, the election. Here, there is a population of people, and a set of candidates. We assume there is one vote per person, and everyone's vote counts equally. A sample data set might look like this:&lt;br /&gt;&lt;table style="text-align: left; border-collapse: collapse; width: 305px; height: 200px; margin-left: 40px;" border="1" cellpadding="2" cellspacing="2"&gt;&lt;br /&gt;&lt;col style="width: 54pt;" span="2" width="72"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th style="text-align: center;"&gt;Voter&lt;/th&gt; &lt;th style="text-align: center;"&gt;Candidate&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;John Q. Public&lt;/td&gt; &lt;td&gt;John McCain&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Ennio Citizen&lt;/td&gt; &lt;td&gt;Barack Obama&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Mary J. Student&lt;/td&gt; &lt;td&gt;Barack Obama&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Alfred E. Oldman&lt;/td&gt; &lt;td&gt;Ralph Nader&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Carter Perch&lt;/td&gt; &lt;td&gt;Bob Barr&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Roger Clifton&lt;/td&gt; &lt;td&gt;Barack Obama&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Eddie Thomas&lt;/td&gt; &lt;td&gt;John McCain&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;div style="margin-left: 40px;"&gt;&lt;br /&gt;&lt;/div&gt;To find the winner, we have to count how many votes each candidate received, then sort on the total number of votes (highest to lowest). The person at the top of the list is the winner. In fact, if we don't care who came in second, third, or fourth, then we don't need to sort; we can just choose the candidate having the highest number of votes. This is a simple and obvious example, but it illustrates some concepts that we will need later.&lt;br /&gt;&lt;br /&gt;In any version of SQL, we can write a one-statement query to list the candidates in order:&lt;br /&gt;&lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;ORDER&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;DESC&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;You might already see a problem.  Who came in third?  The SQL query we just ran will give a &lt;span style="font-weight: bold; font-style: italic;"&gt;non-deterministic&lt;/span&gt; answer. Since we have no way to handle a tie, the query could put either Mr. Nader or Mr. Barr in third place, and there is no way to tell in advance what the result will be. In fact, you could run the &lt;span style="font-style: italic;"&gt;exact same query&lt;/span&gt; twice, and get two different results.&lt;br /&gt;&lt;br /&gt;So we need a &lt;span style="font-weight: bold;"&gt;tiebreak rule&lt;/span&gt;. In every problem of this type, a tiebreak rule is required in order to get consistent, reproducible results. Also, the tiebreak rule must be sufficient to completely disambiguate the candidates. In SQL terms, the tiebreak rule must be created using a set of columns that uniquely identify each row. This is also known as a &lt;span style="font-weight: bold;"&gt;candidate key&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;In our simple election example, we can get by if we add a secondary sort, using the candidate's name. It is arbitrary whether to sort alphabetically ascending or descending (or using some other method, like the reverse of the string). &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;The sorting method will of course affect the result, and care should be taken to choose a fair (or at least reasonable) method if possible. &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;But a choice must be made.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is our finished query to give the election results:&lt;br /&gt; &lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;votes&lt;br&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;ORDER&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;DESC&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;DESC&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;How would we get back a single row, showing only the winner? The easiest way would be to use the "TOP 1" option with the above query. Another way would be to assign a sequential ranking number to each candidate, and then select the one whose rank=1. However if your version of SQL does not have the functionality to do either of those, but does allow subqueries, you could still get a solution using "brute force":&lt;br /&gt;&lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;MAX&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;last_candidate_name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;BB&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;MAX&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;num_votes&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;max_votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;candidate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;CC&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;C&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;WHERE&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.candidate&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B.last_candidate_name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;AND&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.num_votes&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B.num_votes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;AND&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.num_votes&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;C.max_votes&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;Although we got the answer using a single query, this seems like quite a lot of work! And we are scanning the "votes" table three times. It would make more sense to store some results in an intermediate table. This would also be a good place to use "Common Table Expressions", a feature introduced with Microsoft SQL Server 2005.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;span style="text-decoration: underline;font-size:130%;font-weight: bold;" &gt;Magazine Subscription Problem&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;The preceding example has a single group. But what if we have many groups, and we want to find the most popular selection within each group? The magazine subscription problem is a good illustration of this situation:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table style="text-align: left; border-collapse: collapse; width: 60%; margin-left: 40px;" border="1" cellpadding="2" cellspacing="2"&gt; &lt;col style="width: 54pt;" span="3" width="72"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;th style="text-align: center;"&gt;Subscriber&lt;/th&gt; &lt;th style="text-align: center;"&gt;ZIP code&lt;/th&gt; &lt;td style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Magazine&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;John Q. Public&lt;/td&gt; &lt;td&gt;20001&lt;/td&gt; &lt;td&gt;Life&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;John Q. Public&lt;/td&gt; &lt;td&gt;20001&lt;/td&gt; &lt;td&gt;Washingtonian&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Ennio Citizen&lt;/td&gt; &lt;td&gt;20001&lt;/td&gt; &lt;td&gt;New Yorker&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Ennio Citizen&lt;/td&gt; &lt;td&gt;20001&lt;/td&gt; &lt;td&gt;Washingtonian&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Mary J. Student&lt;/td&gt; &lt;td&gt;90210&lt;/td&gt; &lt;td&gt;Atlantic&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Mary J. Student&lt;/td&gt; &lt;td&gt;90210&lt;/td&gt; &lt;td&gt;Chronicle&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Mary J. Student&lt;/td&gt; &lt;td&gt;90210&lt;/td&gt; &lt;td&gt;Life&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td&gt;Alfred E. Oldman&lt;/td&gt;&lt;td&gt;10016&lt;/td&gt;&lt;td&gt;New Yorker&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alfred E. Oldman&lt;/td&gt;&lt;td&gt;10016&lt;/td&gt;&lt;td&gt;Time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Carter Perch&lt;/td&gt;&lt;td&gt;90210&lt;/td&gt;&lt;td&gt;New Yorker&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Carter Perch&lt;/td&gt;&lt;td&gt;90210&lt;/td&gt;&lt;td&gt;Time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Carter Perch&lt;/td&gt;&lt;td&gt;90210&lt;/td&gt;&lt;td&gt;Mad&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Carter Perch&lt;/td&gt;&lt;td&gt;90210&lt;/td&gt;&lt;td&gt;Atlantic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Roger Clifton&lt;/td&gt;&lt;td&gt;20001&lt;/td&gt;&lt;td&gt;Vogue&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Roger Clifton&lt;/td&gt;&lt;td&gt;20001&lt;/td&gt;&lt;td&gt;Elle&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Eddie Thomas&lt;/td&gt;&lt;td&gt;10016&lt;/td&gt;&lt;td&gt;New Yorker&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Eddie Thomas&lt;/td&gt;&lt;td&gt;10016&lt;/td&gt;&lt;td&gt;Atlantic&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Eddie Thomas&lt;/td&gt;&lt;td&gt;10016&lt;/td&gt;&lt;td&gt;Time&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;We want to identify the single most popular magazine within each ZIP code. As before, we need a tiebreak rule, which will just be the magazine name in (ascending) alphabetical order. Here is the "brute force" method:&lt;/span&gt;&lt;br /&gt;&lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine_subscriptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;MIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;first_magazine_name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine_subscriptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;BB&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;MAX&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;max_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine_subscriptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;CC&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;C&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;WHERE&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.ZIP_code&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B.ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;AND&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.magazine&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B.first_magazine_name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;AND&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.num_subs&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B.num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;AND&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.ZIP_code&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;C.ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;AND&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A.num_subs&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;C.max_subs&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Again, an awful lot of work and duplicated code.&lt;br /&gt;&lt;br /&gt;Here is an alternative method, using SQL Server 2000 and the "IGNORE_DUP_KEY" indexing option:&lt;/span&gt;&lt;br /&gt;&lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;most_popular_magazine_by_ZIP_code&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;VARCHAR&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;10&lt;/span&gt;&lt;span style="color:gray"&gt;)&lt;br&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;VARCHAR&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;30&lt;/span&gt;&lt;span style="color:gray"&gt;)&lt;br&gt;)&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;CREATE&amp;nbsp;UNIQUE&amp;nbsp;INDEX&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;most_popular_magazine_by_ZIP_code_IDX&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;ON&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;most_popular_magazine_by_ZIP_code&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&lt;/span&gt;&lt;span style="color:gray"&gt;)&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;WITH&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;IGNORE_DUP_KEY&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;INSERT&amp;nbsp;INTO&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;most_popular_magazine_by_ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine_subscriptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;ORDER&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;DESC&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;*&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;most_popular_magazine_by_ZIP_code&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;This requires an extra table, a couple of steps, and a Microsoft-specific feature, but for a large data set it will perform better than the "brute force" method. Notice the &lt;/span&gt;&lt;code  style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;ORDER BY&lt;/span&gt;&lt;/code&gt;&lt;span style="font-family:georgia;"&gt; clause for the &lt;/span&gt;&lt;code  style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;INSERT &lt;/span&gt;&lt;/code&gt;&lt;span style="font-family:georgia;"&gt;statement - it includes the magazine name as the final sort key, to enforce the tiebreak rule. This is very important because otherwise you will have a non-deterministic result.&lt;br /&gt;&lt;br /&gt;Let's see how using Analytic Functions might help.&lt;br /&gt;&lt;br /&gt;Analytic functions are also known as Ranking or Windowing functions. In Microsoft SQL Server 2005, they include the functions RANK(), DENSE_RANK(), NTILE(), and ROW_NUMBER(). Oracle has had analytical functions since Version 8i (1999). In addition to the four functions just listed, Oracle includes a much richer set of functions, including CUME_DIST(), FIRST_VALUE(), LAST_VALUE(), and PERCENT_RANK(). Unlike SQL Server, Oracle functions can also operate on a sliding window of rows, so that you can do things like a moving average within a single query.&lt;br /&gt;&lt;br /&gt;For the magazine subscription problem, we can use the ROW_NUMBER() function. This function will return a unique, sequential, ascending number for each row in a result set. But it can also operate on groups of rows that are defined by a &lt;span style="font-weight: bold;"&gt;partition&lt;/span&gt;, so that each group has its own set of sequence numbers.&lt;br /&gt;&lt;br /&gt;The method is to count the number of subscriptions, grouping by both ZIP_code and magazine name, and then use ROW_NUMBER() to assign a popularity ranking for each magazine &lt;/span&gt;&lt;span style="font-family:georgia;"&gt; within each ZIP code:&lt;/span&gt;&lt;br /&gt;&lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;row_number&lt;/span&gt;&lt;span style="color:gray"&gt;()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;OVER&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;PARTITION&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;zip_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;ORDER&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;DESC&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;mag_rank&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine_subscriptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;Again, notice the use of the magazine name to enforce the tiebreak rule - it is included in the &lt;code  style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;ORDER &lt;/span&gt;&lt;/code&gt;&lt;code  style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;BY &lt;/span&gt;&lt;/code&gt;clause within the &lt;code  style="font-size:12px;"&gt;&lt;/code&gt;&lt;code  style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;PARTITION&lt;/span&gt;&lt;/code&gt;&lt;code  style="font-size:12px;"&gt;&lt;span style="color:black;"&gt; &lt;/span&gt;&lt;/code&gt;specification.  Here is the result:&lt;br /&gt;&lt;br /&gt;&lt;table style="border-collapse: collapse; width: 300px; margin-left: 40px;" str="" border="1" cellpadding="2" cellspacing="2"&gt;&lt;col style="width: 50pt;" width="66"&gt;  &lt;col style="width: 113pt;" width="151"&gt;  &lt;col style="width: 55pt;" width="73"&gt;  &lt;col style="width: 82pt;" width="109"&gt;  &lt;tbody&gt;&lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl24" style="height: 15.75pt; width: 50pt; font-weight: bold;" height="21" width="66"&gt;ZIP_code&lt;/td&gt;   &lt;td class="xl26" style="border-left: medium none; width: 113pt; font-weight: bold;" width="151"&gt;Magazine&lt;/td&gt;   &lt;td class="xl26" style="border-left: medium none; width: 55pt; text-align: center; font-weight: bold;" width="73"&gt;num_subs&lt;/td&gt;   &lt;td class="xl26" style="border-left: medium none; width: 82pt; text-align: center; font-weight: bold;" width="109"&gt;mag_rank&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;10016&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;New   Yorker&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;2&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;1&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;10016&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Time&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;2&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;2&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;10016&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Atlantic&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;3&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;20001&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Washingtonian&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;2&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;1&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;20001&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Elle&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;2&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;20001&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Life&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;3&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;20001&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;New   Yorker&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;4&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;20001&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Vogue&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" num="" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;"&gt;5&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;90210&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Atlantic&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;2&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;1&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;90210&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Chronicle&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;2&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;90210&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Life&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;3&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;90210&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Mad&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;4&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;90210&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;New   Yorker&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;5&lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 15.75pt;" height="21"&gt;   &lt;td class="xl28" style="border-top: medium none; height: 15.75pt; width: 50pt;" num="" height="21" width="66"&gt;90210&lt;/td&gt;   &lt;td class="xl27" style="border-top: medium none; border-left: medium none; width: 113pt;" width="151"&gt;Time&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 55pt; text-align: center;" num="" width="73"&gt;1&lt;/td&gt;   &lt;td class="xl25" style="border-top: medium none; border-left: medium none; width: 82pt; text-align: center;" num="" width="109"&gt;6&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Now, to get the single most popular magazine for each ZIP, all we have to do is filter on mag_rank = 1:&lt;br /&gt;&lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;most_popular_magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;row_number&lt;/span&gt;&lt;span style="color:gray"&gt;()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;OVER&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;PARTITION&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;zip_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;ORDER&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;DESC&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;mag_rank&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine_subscriptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;B&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;WHERE&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;mag_rank&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;1&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;This is even easier in Oracle, where the FIRST_VALUE() function does the filtering for you:&lt;br /&gt;&lt;code style="font-size: 12px;"&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;DISTINCT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;first_value&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;/span&gt;&lt;span style="color:gray"&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;OVER&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:black"&gt;PARTITION&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;ORDER&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;DESC&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;most_popular_magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(&lt;/span&gt;&lt;span style="color:blue"&gt;SELECT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:magenta"&gt;COUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;(*)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;num_subs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;FROM&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine_subscriptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue"&gt;GROUP&amp;nbsp;BY&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;ZIP_code&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;magazine&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:black"&gt;A&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;Be careful, you need the  &lt;code size="12px"&gt;&lt;span style="color:blue;"&gt;DISTINCT &lt;/span&gt;&lt;/code&gt;qualifier here or you will get duplicate rows.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;In Part 2 of this article, we will look at a more complicated example that illustrates how to use a weighting factor and how to create multiple result columns in a single operation.&lt;/span&gt;</description><link>http://blog.warfieldconsulting.com/2009/01/popularity-problem-application-of-sql.html</link><author>noreply@blogger.com (Tom Warfield)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4656928825788854821.post-2223474346155784910</guid><pubDate>Sun, 11 Jan 2009 22:29:00 +0000</pubDate><atom:updated>2009-01-27T07:49:14.737-05:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>meat pie</category><category domain='http://www.blogger.com/atom/ns#'>radio</category><category domain='http://www.blogger.com/atom/ns#'>google</category><title>Six Foot Column of Meat Pies</title><description>Have you ever heard something in passing, and thought to yourself, "Why, that sounds interesting, but I don't know much about it - I'll look it up later on Google"?  Well it happens to me all the time.  Natural curiosity I guess, and with Google you can pretty much find anything - that is, anything that actually exists.  In fact I located a long-lost high-school sweetheart, and eventually married her, through Google ... now she calls me "Mr. Google" ... but that is another story.&lt;br /&gt;&lt;br /&gt;What does it mean when you go to Google, search on your keywords, and turn up absolutely nothing?  I mean, ZERO hits?  Doesn't even make the list?  Doesn't even show up on Google Trends?&lt;br /&gt;&lt;br /&gt;Shortly before Thanksgiving last year, I was driving my stepson to school.  While en-route, he likes to punch the radio buttons like crazy, veering wildly from station to station.  In between Led Zeppelin on one station, and Black Sabbath on another, this phrase popped out:  "Six foot column of meat pies".  I tried to grab the button and turn back to that station, because wow, how could I pass up the opportunity to see something like that?  Hey, I've seen James Brown, the Grand Canyon, and the Eiffel Tower, but I've never seen a column of meat pies, much less one that is taller than me!&lt;br /&gt;&lt;br /&gt;But we were too late - we didn't know what station it came from, and the commercial or whatever it was must have finished, before we could scan enough stations to find it again.&lt;br /&gt;&lt;br /&gt;Now where would you find a column of meat pies?  A bakery?  A restaurant?  Surely it is some local business with a Thanksgiving promotion, I thought.  And if they are advertising on the radio, it would certainly be on the Internet.  I just hoped I wouldn't find thousands of meat pie dealers, and be unable to tell which one put out the commercial on our local station!&lt;br /&gt;&lt;br /&gt;So, as you must have guessed, when we got home I Googled it.  Nothing.  OK, so there must be a couple of days of lag time - so I tried a few days later.  Still nothing.  "Six foot column of meat pies, six foot column of meat pies,  six foot column of meat pies ..." say it over and over, and you get into kind of a chanting, conga-line rhythm, that you might find stuck in your head.  Every week or so I would check Google again.  Every month.  Nothing.  Nothing.  Nothing.  How could this be?&lt;br /&gt;&lt;br /&gt;My stepson was forming a rock band, and they needed a name.  "How about 'Six Foot Column of Meat Pies'?" I suggested.&lt;br /&gt;&lt;br /&gt;Then one day I tried using the numeral 6, instead of the word "Six".  Don't know why this never occured to me before - and besides, doesn't Google handle this kind of substitution automatically?  I know it checks alternate spellings and puts in singular when you mean plural ....&lt;br /&gt;&lt;br /&gt;Well finally the mystery is solved.  No, there is no local bakery or restaurant specializing in meat pies.  Nobody in this country even eats meat pies (well, almost nobody).  It was a news story, originating in England (who could have guessed that?), with the headline "&lt;a href="http://www.metro.co.uk/news/article.html?&amp;amp;in_article_id=365338"&gt;My six years of agony over a meat pie&lt;/a&gt;".  And what's worse, it turns out the "column of meat pies" wasn't really six feet high at all -  it was 1.8 meters!  Try doing a conga-line to that.&lt;br /&gt;&lt;br /&gt;As disappointed as I am, since I now realize I will likely never actually see a six foot column of meat pies, I can at least console myself with the thought that Google will eventually pick up this article.  Then there will at last be something to find, if there is any other poor soul out there still looking!&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;On 2009/01/12 at 11:35 AM, the author added this Followup:&lt;br /&gt;&lt;br /&gt;Within 15 hours, Google came through.  Searching on &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=%22six+foot+column+of+meat+pies%22&amp;amp;btnG=Search"&gt;"six foot column of meat pies"&lt;/a&gt; (including the quotes) now points to this page.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;On 2009/01/15 at 1:46 AM, the author added this Followup:&lt;br /&gt;&lt;br /&gt;How fleeting is fame.  Three days later, and my same &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=%22six+foot+column+of+meat+pies%22&amp;amp;btnG=Search"&gt;Google search&lt;/a&gt; turns up empty again.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;On 2009/01/27 at 7:42 AM, the author added this Followup:&lt;br /&gt;&lt;br /&gt;Well, whaddya know.  My &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=%22six+foot+column+of+meat+pies%22&amp;amp;btnG=Search"&gt;Google search&lt;/a&gt; hit is back.  And I turned up on &lt;a href="http://technorati.com/search/%22Six+foot%22+column+%22meat+pies%22.?language=en"&gt;Technorati&lt;/a&gt;.</description><link>http://blog.warfieldconsulting.com/2009/01/six-foot-column-of-meat-pies.html</link><author>noreply@blogger.com (Tom Warfield)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4656928825788854821.post-8723225470669610912</guid><pubDate>Thu, 10 Jul 2008 13:36:00 +0000</pubDate><atom:updated>2008-07-12T12:54:39.019-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>beforehand</category><category domain='http://www.blogger.com/atom/ns#'>usage</category><category domain='http://www.blogger.com/atom/ns#'>thank you</category><category domain='http://www.blogger.com/atom/ns#'>manners</category><category domain='http://www.blogger.com/atom/ns#'>thanks</category><category domain='http://www.blogger.com/atom/ns#'>in advance</category><title>Thanks In Advance for Reading My Blog</title><description>&lt;div style="text-align: justify;"&gt;Several times a day I get requests that end with some variation of "Thanks in advance". I understand that the correspondent is trying to be polite, but I can't help feeling a bit uncomfortable with this expression.  I remember reading a &lt;a href="http://www.washingtonpost.com/wp-dyn/content/linkset/2005/03/25/LI2005032501837.html"&gt;Miss Manners&lt;/a&gt; column on this topic years ago - sadly I can't find it now - but the idea has stuck with me that it is bad form to thank someone "in advance".&lt;br /&gt;&lt;br /&gt;In search of some justification for this position, I turned to Google and discovered that there is some debate.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://homepages.wmich.edu/%7Ebowman/c4aframe.html"&gt;Western Michigan University&lt;/a&gt; says:&lt;br /&gt;&lt;blockquote&gt;... avoid thanking the reader in advance ... Thanking in advance is discourteous because it presumes that the reader has no choice other than to respond.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.wilbers.com/Thanks.htm"&gt;The Minneapolis Star Tribune&lt;/a&gt; says:&lt;br /&gt;&lt;blockquote&gt;Don't ... Use the phrase “thank you in advance” in your complimentary close.  It’s standard practice to encourage readers to take a desired action by thanking them before they’ve actually done it, but “in advance” can sound presumptuous.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://www.writeexpress.com/appreciation.htm"&gt;WriteExpress&lt;/a&gt; says:&lt;br /&gt;&lt;blockquote&gt;Avoid thanking the person beforehand ... To do so is presumptuous and suggests you do not feel the need to write a follow-up letter.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Apparently in Austrailia it is acceptable in some situations&lt;br /&gt;&lt;a href="http://au.answers.yahoo.com/question/index?qid=20080302151503AAEasII"&gt;Is it polite or presumptuous when you thank people in advance?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... but not in New Zealand:&lt;br /&gt;&lt;a href="http://nz.answers.yahoo.com/question/index?qid=20080221132215AAG5yc8"&gt;Is the phrase "Thanks in advance" offensive?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The 1913 book &lt;a style="font-style: italic;" href="http://books.google.com/books?id=QJsCAAAAYAAJ&amp;amp;pg=PA152&amp;amp;lpg=PA152&amp;amp;dq=thanking+in+advance&amp;amp;source=web&amp;amp;ots=KFGa4bKIFx&amp;amp;sig=NjJVitlMDnW-mziaY3j3obNbSPo&amp;amp;hl=en&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;resnum=1&amp;amp;ct=result"&gt;Composition Planning&lt;/a&gt; by John Baker Opdycke says:&lt;br /&gt;&lt;blockquote&gt;"Thanking in advance" smacks something too much of the spirit of forcing ... the reader ... into granting our request&lt;br /&gt;&lt;/blockquote&gt;But not everyone agrees, as you can see from the following:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://www.sitepoint.com/blogs/2008/05/20/thanks-for-what/"&gt;Thanks for What?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://forum.wordreference.com/showthread.php?t=176988"&gt;Thank you in advance&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://separatedbyacommonlanguage.blogspot.com/2007/03/cheers.html"&gt;Cheers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://eduqna.com/Words-Wordplay/747-1-Words-Wordplay-7.html"&gt;Does the phrase "thank you in advance" drive anyone else crazy?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://home.stny.rr.com/htuckey/W001005/WORDS001.txt"&gt;IBM Internal Use Only&lt;/a&gt; (!) - &lt;span style="font-style: italic;"&gt;near the bottom; search for "Changing the Subject"&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Finally, for a light-hearted view, there is this from The Cynic:&lt;br /&gt;&lt;a href="http://archive.cynicmag.com/archive.asp?articleid=1793&amp;amp;cat=Features"&gt;Thank You in Advance&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After reviewing these references, my opinion hasn't changed.  One should avoid using the phrase "thanks in advance", if only because it could offend some of your audience.  On the other hand, one should try not to &lt;span style="font-style: italic;"&gt;be&lt;/span&gt; offended if someone says it to you, because they probably only intend it as a courtesy.&lt;br /&gt;&lt;br /&gt;And finally it seems like "thanks in advance" has turned into one of those ubiquitous expressions that it won't be possible to avoid.  At least it's not outright wrong, like using &lt;a href="http://www.wsu.edu/%7Ebrians/errors/lose.html"&gt;"loose" when you mean "lose"&lt;/a&gt;, or &lt;a href="http://www.wsu.edu/%7Ebrians/errors/tact.html"&gt;"tact" instead of "tack"&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://blog.warfieldconsulting.com/2008/07/thanks-in-advance-for-reading-my-blog.html</link><author>noreply@blogger.com (Tom Warfield)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4656928825788854821.post-7652947439059967607</guid><pubDate>Fri, 13 Jun 2008 11:51:00 +0000</pubDate><atom:updated>2008-06-13T09:58:58.904-04:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>uninstall</category><category domain='http://www.blogger.com/atom/ns#'>install</category><category domain='http://www.blogger.com/atom/ns#'>delete</category><category domain='http://www.blogger.com/atom/ns#'>question</category><title>Uninstalling Stuff (Question from my niece)</title><description>Q. Tom:&lt;br /&gt;&lt;br /&gt;Blockland is on my computer. Can I delete the whole folder, with the .exe and everything?&lt;br /&gt;&lt;br /&gt;A. &lt;br /&gt;I don't know what Blockland is.  But I'll tell you what I know about uninstalling.&lt;br /&gt;&lt;div class="moz-text-html" lang="x-western"&gt;&lt;br /&gt;In the "good old days", installing and uninstalling were simple - to install something, you would just copy a file (or a bunch of files) to your machine; to uninstall, you would just delete them.&lt;br /&gt;&lt;br /&gt;Many people still subscribe to this "K.I.S.S." philsophy.  The "&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt;" program works this way - you download a .ZIP file, then extract the files and put them somewhere, then run procexp.exe from wherever you left it.&lt;br /&gt;&lt;br /&gt;But then along came Windows.  Nowadays most programs come with an installer package.  It just so happens that I'm working on one of these evil beasts right now for the newspaper software company that is my main client, which is why you're getting the big long answer instead of a yes/no.  An installer does a whole lot of other stuff:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Puts information about the program in the Registry&lt;/li&gt;&lt;li&gt;Saves a copy of itself that you can't delete in a hidden directory that you can't see&lt;/li&gt;&lt;li&gt;Adds to the Start Menu (sometimes this is optional)&lt;/li&gt;&lt;li&gt;Adds to the Desktop (sometimes this is optional)&lt;/li&gt;&lt;li&gt;Adds itself to the list that you see in "Add/Remove Programs"&lt;/li&gt;&lt;li&gt;Adds an "Uninstaller" for itself, that is supposed to completely remove the program, &lt;i&gt;but only if you run it the right way&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Might also connect to the internet and register you there and/or download updates&lt;/li&gt;&lt;/ol&gt;If you try to just delete files for a program that used an installer, things can get pretty messed up.  I've done this several times, to the point where the program is both installed and not installed - you can't uninstall it because the uninstaller fails; but you can't re-install it either because it is already installed.   &lt;a href="http://blog.coderpunk.com/2007/02/sshfs.html"&gt;BPITA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Often the uninstaller programs have bugs and fail in the middle - even more often, they remove most of a program's residue but still leave stuff for you to clean up manually (this is why you can end up with empty folders in your Start Menu).&lt;br /&gt;&lt;br /&gt;So the short answer is, if you find the program in Add/Remove Programs, uninstall it that way.  If you see that there is an "Uninstall" entry for the program in the Start Menu, use that.  Otherwise, delete everything and hope for the best.&lt;br /&gt;&lt;br /&gt;-T&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://blog.warfieldconsulting.com/2008/06/uninstalling-stuff-question-from-my.html</link><author>noreply@blogger.com (Tom Warfield)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>
