<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Anal%C3%BDza_dom%C3%A9n</id>
	<title>Analýza domén - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Anal%C3%BDza_dom%C3%A9n"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Anal%C3%BDza_dom%C3%A9n&amp;action=history"/>
	<updated>2026-06-02T19:12:11Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Anal%C3%BDza_dom%C3%A9n&amp;diff=441&amp;oldid=prev</id>
		<title>imported&gt;Pavel v 1. 12. 2008, 14:58</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Anal%C3%BDza_dom%C3%A9n&amp;diff=441&amp;oldid=prev"/>
		<updated>2008-12-01T14:58:12Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Převzato z http://www.depesz.com/index.php/2008/12/01/getting-list-of-most-common-domains/#comment-27066&lt;br /&gt;
&lt;br /&gt;
Následující kód je v podstatě první ukázkou jedné z vlastností PostgreSQL a to možnosti volání SRF funkcí v normálním kontextu. Tuto vlastnost nemám rád, ale v tomto případě má smysl. Představte si, že máte seznam (log) domén - a nyní budete chtít dohledat četnost jednotlivých domén. Tedy uložené domény musíme transformovat (např. psql.cz na psql.cz a cz). Tj. musíme namnožit řádky - což v čistém SQL nelze - (v ANSI SQL 200x by bylo možné použít CTE, patrně by se nejednalo o žádný zázrak). Možnosti jsou 2 - buďto napíšeme klasickou SRF funkci nad konkrétní tabulkou (což je metoda, kterou preferuji) nebo funkci, která převede hodnotu domény na hierarchický seznam poddomén.&lt;br /&gt;
&lt;br /&gt;
a) připravím si pomocné funkce:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# create or replace function domain_list(varchar[]) &lt;br /&gt;
           returns setof varchar as $$&lt;br /&gt;
              select array_to_string($1,’.&amp;#039;) &lt;br /&gt;
              union all &lt;br /&gt;
              select domain_list($1[2:array_upper($1,1)]) &lt;br /&gt;
                 where array_upper($1,1) &amp;gt; 1 &lt;br /&gt;
           $$ language sql immutable strict;&lt;br /&gt;
CREATE FUNCTION&lt;br /&gt;
postgres=# select domain_list(array[&amp;#039;a&amp;#039;,&amp;#039;b&amp;#039;,&amp;#039;c&amp;#039;,&amp;#039;d&amp;#039;]);&lt;br /&gt;
domain_list&lt;br /&gt;
————-&lt;br /&gt;
a.b.c.d&lt;br /&gt;
b.c.d&lt;br /&gt;
c.d&lt;br /&gt;
d&lt;br /&gt;
(4 rows)&lt;br /&gt;
&lt;br /&gt;
postgres=# create or replace function domain_list(varchar) &lt;br /&gt;
           returns setof varchar as $$ &lt;br /&gt;
              select domain_list(string_to_array($1, ‘.’))&lt;br /&gt;
           $$ language sql immutable strict;&lt;br /&gt;
CREATE FUNCTION&lt;br /&gt;
postgres=# select domain_list(’a.b.c.d’);&lt;br /&gt;
domain_list&lt;br /&gt;
————-&lt;br /&gt;
a.b.c.d&lt;br /&gt;
b.c.d&lt;br /&gt;
c.d&lt;br /&gt;
d&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
b) pro tabulku domains si funkcí domain_list namnožíme řádky:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# select * from domains;&lt;br /&gt;
       d        &lt;br /&gt;
----------------&lt;br /&gt;
 pgsql.cz&lt;br /&gt;
 lmc.cz&lt;br /&gt;
 postgresql.org&lt;br /&gt;
 gnome.org&lt;br /&gt;
(4 rows)&lt;br /&gt;
&lt;br /&gt;
postgres=# select domain_list(d), d from domains;&lt;br /&gt;
  domain_list   |       d        &lt;br /&gt;
----------------+----------------&lt;br /&gt;
 pgsql.cz       | pgsql.cz&lt;br /&gt;
 cz             | pgsql.cz&lt;br /&gt;
 lmc.cz         | lmc.cz&lt;br /&gt;
 cz             | lmc.cz&lt;br /&gt;
 postgresql.org | postgresql.org&lt;br /&gt;
 org            | postgresql.org&lt;br /&gt;
 gnome.org      | gnome.org&lt;br /&gt;
 org            | gnome.org&lt;br /&gt;
(8 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Výsledek po agregaci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# select domain_list(d), count(*) &lt;br /&gt;
              from domains &lt;br /&gt;
             group by domain_list(d) &lt;br /&gt;
             order by 2 desc, 1;&lt;br /&gt;
  domain_list   | count &lt;br /&gt;
----------------+-------&lt;br /&gt;
 cz             |     2&lt;br /&gt;
 org            |     2&lt;br /&gt;
 gnome.org      |     1&lt;br /&gt;
 lmc.cz         |     1&lt;br /&gt;
 pgsql.cz       |     1&lt;br /&gt;
 postgresql.org |     1&lt;br /&gt;
(6 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Docela hezký trik.&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>