<?xml version="1.0" encoding="UTF-8" standalone="yes"?><oembed><version><![CDATA[1.0]]></version><provider_name><![CDATA[Occasionally Coherent]]></provider_name><provider_url><![CDATA[http://blog.bimajority.org]]></provider_url><author_name><![CDATA[Garrett Wollman]]></author_name><author_url><![CDATA[https://blog.bimajority.org/author/garrettwollman/]]></author_url><title><![CDATA[From the &#8220;Pointless SQL Queries&#8221;&nbsp;file&#8230;]]></title><type><![CDATA[link]]></type><html><![CDATA[<p>Somehow, the question came up on <a href="news:alt.usage.english">alt.usage.english</a> of the distribution of author surnames (in people&#8217;s personal libraries) over the letters of the alphabet.  Since I have a library database, I came up with the followng crazy query to answer this question:</p>
<pre>SELECT first_letter, total, authors, (100.0 * "count" * auth_count / total)::NUMERIC(4,1) AS "%"
  FROM (SELECT first_letter, "count", COUNT(author.name) AS auth_count, string_agg(author.name, '; ') AS "authors" 
        FROM (SELECT author_num, UPPER(SUBSTR(author.name, 1, 1)) AS first_letter, COUNT(*) as "count", RANK() OVER (PARTITION BY UPPER(SUBSTR(author.name, 1, 1)) ORDER BY COUNT(*) DESC) AS "rank"
              FROM book_author JOIN author ON (author.number = book_author.author_num)
              GROUP BY author_num, author.name) AS foo
          JOIN author ON (author_num = author.number)
        WHERE "rank" = 1 AND "count" &gt; 1
        GROUP BY first_letter, "count") AS bar
    RIGHT OUTER JOIN (SELECT UPPER(SUBSTR(author.name, 1, 1)) AS first_letter, COUNT(*) AS "total"
                      FROM book_author JOIN author ON (author.number = book_author.author_num)
                      GROUP BY first_letter) AS baz
      USING (first_letter)
 ORDER BY first_letter</pre>
<p>See if you can figure out what that query (with doubly-nested subselects) is doing, and if there&#8217;s a more efficient way to write it.  Here are the results:</p>
<table>
<tr>
<th align="center">first_letter</th>
<th align="center">total</th>
<th align="center">authors</th>
<th align="center">%</th>
</tr>
<tr valign="top">
<td align="left">A</td>
<td align="right">87</td>
<td align="left">Asimov, Isaac</td>
<td align="right">21.8</td>
</tr>
<tr valign="top">
<td align="left">B</td>
<td align="right">144</td>
<td align="left">Bryson, Bill</td>
<td align="right">9.7</td>
</tr>
<tr valign="top">
<td align="left">C</td>
<td align="right">88</td>
<td align="left">Carey, Jacqueline; Czerneda, Julie E.</td>
<td align="right">11.4</td>
</tr>
<tr valign="top">
<td align="left">D</td>
<td align="right">94</td>
<td align="left">Duane, Diane</td>
<td align="right">28.7</td>
</tr>
<tr valign="top">
<td align="left">E</td>
<td align="right">41</td>
<td align="left">Editors of Cook&#8217;s Illustrated</td>
<td align="right">24.4</td>
</tr>
<tr valign="top">
<td align="left">F</td>
<td align="right">103</td>
<td align="left">Fenner, Cathy; Fenner, Arnie</td>
<td align="right">44.7</td>
</tr>
<tr valign="top">
<td align="left">G</td>
<td align="right">87</td>
<td align="left">Gould, Stephen Jay</td>
<td align="right">24.1</td>
</tr>
<tr valign="top">
<td align="left">H</td>
<td align="right">99</td>
<td align="left">Heinlein, Robert A.</td>
<td align="right">13.1</td>
</tr>
<tr valign="top">
<td align="left">I</td>
<td align="right">1</td>
<td align="left">&nbsp; </td>
<td align="right">&nbsp; </td>
</tr>
<tr valign="top">
<td align="left">J</td>
<td align="right">27</td>
<td align="left">Jakubowski, Maxim; Jones, Diana Wynne</td>
<td align="right">14.8</td>
</tr>
<tr valign="top">
<td align="left">K</td>
<td align="right">58</td>
<td align="left">Kahn, David</td>
<td align="right">10.3</td>
</tr>
<tr valign="top">
<td align="left">L</td>
<td align="right">158</td>
<td align="left">Lackey, Mercedes</td>
<td align="right">37.3</td>
</tr>
<tr valign="top">
<td align="left">M</td>
<td align="right">134</td>
<td align="left">May, Julian</td>
<td align="right">11.9</td>
</tr>
<tr valign="top">
<td align="left">N</td>
<td align="right">42</td>
<td align="left">Norton, Andre</td>
<td align="right">9.5</td>
</tr>
<tr valign="top">
<td align="left">O</td>
<td align="right">19</td>
<td align="left">O&#8217;Donohoe, Nick</td>
<td align="right">15.8</td>
</tr>
<tr valign="top">
<td align="left">P</td>
<td align="right">62</td>
<td align="left">Pratchett, Terry</td>
<td align="right">25.8</td>
</tr>
<tr valign="top">
<td align="left">Q</td>
<td align="right">1</td>
<td align="left">&nbsp; </td>
<td align="right">&nbsp; </td>
</tr>
<tr valign="top">
<td align="left">R</td>
<td align="right">66</td>
<td align="left">Raymo, Chet; Rombauer, Irma S.</td>
<td align="right">12.1</td>
</tr>
<tr valign="top">
<td align="left">S</td>
<td align="right">159</td>
<td align="left">Sacks, Oliver</td>
<td align="right">5.0</td>
</tr>
<tr valign="top">
<td align="left">T</td>
<td align="right">55</td>
<td align="left">Tolkien, J.R.R.</td>
<td align="right">14.5</td>
</tr>
<tr valign="top">
<td align="left">U</td>
<td align="right">6</td>
<td align="left">Unebasami, Kari; Unmacht, Robert</td>
<td align="right">66.7</td>
</tr>
<tr valign="top">
<td align="left">V</td>
<td align="right">22</td>
<td align="left">Vallejo, Doris</td>
<td align="right">13.6</td>
</tr>
<tr valign="top">
<td align="left">W</td>
<td align="right">86</td>
<td align="left">Walton, Jo</td>
<td align="right">10.5</td>
</tr>
<tr valign="top">
<td align="left">Y</td>
<td align="right">8</td>
<td align="left">&nbsp; </td>
<td align="right">&nbsp; </td>
</tr>
<tr valign="top">
<td align="left">Z</td>
<td align="right">6</td>
<td align="left">&nbsp; </td>
<td align="right">&nbsp; </td>
</tr>
</table>
]]></html></oembed>