<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Kolumna kótra tryzma w sobie tabelę]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1889</link>
		<description><![CDATA[Najświeższe odpowiedzi w Kolumna kótra tryzma w sobie tabelę.]]></description>
		<lastBuildDate>Fri, 04 Oct 2013 13:01:16 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4753#p4753</link>
			<description><![CDATA[poprawka do kroku 1 - tak będzie chodziło na wersji 8.4 z sortowaniem i z wykorzystaniem funkcji array_agg

create or replace view zwierzaki_v as
with  t1(wlasciciel, zwierze, wiek)
        as (values ('tomek'::varchar,'pies'::varchar,interval '2' year),
                       ('tomek','kot',interval '2' year),
                       ('tomek','pająk',interval '3' month),
                       ('alojzy','ślimak',interval '2' month),
                       ('alojzy','komar',interval '4' day),
                       ('alojzy','mucha',interval '3' day),
                       ('amanda','słoń',interval '20' year),
                       ('amanda','żyrafa',interval '30' year),
                       ('amanda','hipopotam',interval '15' year),
                       ('amanda','nosorożec',interval '45' year))
select d.wlasciciel ,array_agg(cast ((zwierze,wiek) as zw)) as zwierzaki 
from (select wlasciciel, zwierze, wiek from t1 order by wlasciciel, zwierze, wiek) d group by d.wlasciciel]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Fri, 04 Oct 2013 13:01:16 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4753#p4753</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4752#p4752</link>
			<description><![CDATA[Krok 1 - mam nadzieje że działa na 8.4
drop type if exists zw;
create type zw as(
    gatunek varchar,
    wiek interval);

create or replace view zwierzaki_v as
with  t1(wlasciciel, zwierze, wiek)
        as (values ('tomek'::varchar,'pies'::varchar,interval '2' year),
                       ('tomek','kot',interval '2' year),
                       ('tomek','pająk',interval '3' month),
                       ('alojzy','ślimak',interval '2' month),
                       ('alojzy','komar',interval '4' day),
                       ('alojzy','mucha',interval '3' day),
                       ('amanda','słoń',interval '20' year),
                       ('amanda','żyrafa',interval '30' year),
                       ('amanda','hipopotam',interval '15' year),
                       ('amanda','nosorożec',interval '45' year))
select d.wlasciciel ,array(select cast ((zwierze,wiek) as zw) from t1 where t1.wlasciciel=d.wlasciciel order by zwierze,wiek) as zwierzaki from (
select wlasciciel , zwierze, wiek, row_number() over(partition by wlasciciel order by zwierze,wiek) lp from t1
) d where d.lp=1;

Krok 2

select z.wlasciciel,z.zwierzaki[1],z.zwierzaki[1].gatunek,z.zwierzaki[1].wiek from zwierzaki_v z order by z.wlasciciel;]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Fri, 04 Oct 2013 12:16:16 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4752#p4752</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4751#p4751</link>
			<description><![CDATA[Chciałbym ostatecznie zrobić taki view, albo funkcję która będzie mi zwracać:

(własciciel:'tomek',  pozwijane:(zwierze:'pies', wiek:2 lata),
                                         (zwierze:'kot',   wiek:2 lata),
                                         ...
  ...)

aby później ktoś (nie koniecznie ja) mógł napisać np.:

select wlasciciel,
         pozwijane[1],
         pozwijane[1].zwierze
from widok;]]></description>
			<author><![CDATA[dummy@example.com (tomek)]]></author>
			<pubDate>Fri, 04 Oct 2013 12:06:08 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4751#p4751</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4750#p4750</link>
			<description><![CDATA[tu masz drugą wersję tego samego powinna chodzić na 8.4

drop type if exists zw;
create type zw as(
    gatunek varchar,
    wiek interval);

with  t1(wlasciciel, zwierze, wiek)
        as (values ('tomek'::varchar,'pies'::varchar,interval '2' year),
                       ('tomek','kot',interval '2' year),
                       ('tomek','pająk',interval '3' month),
                       ('alojzy','ślimak',interval '2' month),
                       ('alojzy','komar',interval '4' day),
                       ('alojzy','mucha',interval '3' day),
                       ('amanda','słoń',interval '20' year),
                       ('amanda','żyrafa',interval '30' year),
                       ('amanda','hipopotam',interval '15' year),
                       ('amanda','nosorożec',interval '45' year))
select d.wlasciciel ,array(select cast ((zwierze,wiek) as zw) from t1 where t1.wlasciciel=d.wlasciciel order by zwierze,wiek) as zwierzaki, d.zwierze,d.wiek from (
select wlasciciel , zwierze, wiek, row_number() over(partition by wlasciciel order by zwierze,wiek) lp from t1
) d where d.lp=1
order by d.wlasciciel]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Fri, 04 Oct 2013 12:04:27 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4750#p4750</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4749#p4749</link>
			<description><![CDATA[Ad 1 - to faktycznie kwestia wersji bazy danych ja pracuje na 9.2
Ad 2 - ja tworze tabelę rekordów typu "zw" po tu używam cast-a. Robię to po to by potem wykorzystywać nazwy z tego typu rekordu tak jak napisałeś w punkcie 3

Napisz mi o co dokładnie ci chodzi gdy piszesz "Bo zależy mi na moim sposobie" bo chyba trochę się zapętliłeś, może warto pomyśleć jak zrobić to prościej jeśli np potrzebny ci tylko wykaz pierwsze zwierzę i jego wiek dla każdego właściciela to można to zrobić i łatwiej i wydajniej]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Fri, 04 Oct 2013 11:38:26 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4749#p4749</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4748#p4748</link>
			<description><![CDATA[1)
order by zwierze u mnie nie działa (leci błąd).
Postgres 8.4 - może to wina wersji ?

2)
[b]Ja tego nie rozumie [/b]:-( ,

czym się różni twoje zapytanie (które działa) od mojego ???
Tzn. wiem że w twoim jest subquery, ale przecież obaj mamy tak samo:

select wlasciciel,
          array_agg(cast((zwierze,wiek) as zw)) as pozwijane
from t1
group by wlasciciel

Bo zależy mi na moim sposobie - bo chciałbym właśnie mieć taką tabelę t2 (np. jako widok czy funkcja), z której później mógłbym sobie select robić jak w mojej metodzie.]]></description>
			<author><![CDATA[dummy@example.com (tomek)]]></author>
			<pubDate>Fri, 04 Oct 2013 11:22:22 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4748#p4748</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4746#p4746</link>
			<description><![CDATA[to chyba rozwiąże wszystkie twoje problemy


drop type if exists zw;
create type zw as(
    gatunek varchar,
    wiek interval);

with  t1(wlasciciel, zwierze, wiek)
        as (values ('tomek'::varchar,'pies'::varchar,interval '2' year),
                       ('tomek','kot',interval '2' year),
                       ('tomek','pająk',interval '3' month),
                       ('alojzy','ślimak',interval '2' month),
                       ('alojzy','komar',interval '4' day),
                       ('alojzy','mucha',interval '3' day),
                       ('amanda','słoń',interval '20' year),
                       ('amanda','żyrafa',interval '30' year),
                       ('amanda','hipopotam',interval '15' year),
                       ('amanda','nosorożec',interval '45' year))
select d.wlasciciel,d.pozwijane, d.pozwijane[1].gatunek,d.pozwijane[1].wiek from (
select wlasciciel
      ,array_agg(cast ((zwierze,wiek) as zw) order by zwierze) as pozwijane
      from t1
group by wlasciciel
) d]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Fri, 04 Oct 2013 10:52:19 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4746#p4746</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4744#p4744</link>
			<description><![CDATA[OK.
To jeszcze 3 pytania:


1)
-------------------------------------------------------------------------------------
with  t1(wlasciciel, zwierze, wiek) 
        as (values ('tomek'::varchar,'pies'::varchar,interval '2' year),
		               ('tomek','kot',interval '2' year),
                       ('tomek','pająk',interval '3' month),
                       ('alojzy','ślimak',interval '2' month),
                       ('alojzy','komar',interval '4' day),
                       ('alojzy','mucha',interval '3' day),
                       ('amanda','słoń',interval '20' year),
                       ('amanda','żyrafa',interval '30' year),
                       ('amanda','hipopotam',interval '15' year),
                       ('amanda','nosorożec',interval '45' year)),

       t2 as (select wlasciciel, 
                         array_agg((zwierze,wiek) [b]order by zwierze[/b]) as pozwijane
                from t1 
                group by wlasciciel)
            
select wlasciciel, pozwijane
       
from t2;

To mi nie działa.
Innymi słowy jak posortować wewnątrz row?
-------------------------------------------------------------------------------------



2)
-------------------------------------------------------------------------------------
with  t1(wlasciciel, zwierze, wiek) 
        as (values ('tomek'::varchar,'pies'::varchar,interval '2' year),
		               ('tomek','kot',interval '2' year),
                       ('tomek','pająk',interval '3' month),
                       ('alojzy','ślimak',interval '2' month),
                       ('alojzy','komar',interval '4' day),
                       ('alojzy','mucha',interval '3' day),
                       ('amanda','słoń',interval '20' year),
                       ('amanda','żyrafa',interval '30' year),
                       ('amanda','hipopotam',interval '15' year),
                       ('amanda','nosorożec',interval '45' year)),

       t2 as (select wlasciciel, 
                         array_agg((zwierze,wiek)) as pozwijane
                from t1 
                group by wlasciciel)
            
select wlasciciel, 
         pozwijane[1],           /* OK */
         pozwijane[1][1]        /*nie wyświetla mi nic - jak się dostać do tego co jest wewnątrz ???? */
from t2;
-------------------------------------------------------------------------------------



3)
-------------------------------------------------------------------------------------
Czy można jakoś osiągnąć efekt aby mieć:
pozwijane[1]. zwierze ???

Próbowałem tak ale nie działa:


create type zw as(
	gatunek varchar,
	wiek interval);

with  t1(wlasciciel, zwierze, wiek) 
        as (values ('tomek'::varchar,'pies'::varchar,interval '2' year),
		               ('tomek','kot',interval '2' year),
                       ('tomek','pająk',interval '3' month),
                       ('alojzy','ślimak',interval '2' month),
                       ('alojzy','komar',interval '4' day),
                       ('alojzy','mucha',interval '3' day),
                       ('amanda','słoń',interval '20' year),
                       ('amanda','żyrafa',interval '30' year),
                       ('amanda','hipopotam',interval '15' year),
                       ('amanda','nosorożec',interval '45' year)),

       t2 as (select wlasciciel, 
                         array_agg(cast((zwierze,wiek) as zw)) as pozwijane 
                from t1 
                group by wlasciciel)
            
select wlasciciel, 
         pozwijane[1],                        /* OK */
         /*pozwijane[1].zwierze*/        /* źle */
         /*(pozwijane[1]).zwierze */     /*źle*/
from t2;
-------------------------------------------------------------------------------------]]></description>
			<author><![CDATA[dummy@example.com (tomek)]]></author>
			<pubDate>Fri, 04 Oct 2013 09:09:21 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4744#p4744</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4731#p4731</link>
			<description><![CDATA[proponuję takie rozwiązanie
with tabela (wlasciciel,zwierze,wiek) as (values
 ('tomek'::varchar,'pies'::varchar,interval '2' year)
,('tomek','kot',interval '2' year)
,('tomek','pająk',interval '3' month)
,('alojzy','ślimak',interval '2' month)
,('alojzy','komar',interval '4' day)
,('alojzy','mucha',interval '3' day)
,('amanda','słoń',interval '20' year)
,('amanda','żyrafa',interval '30' year)
,('amanda','hipopotam',interval '15' year))
select wlasciciel,array_agg ((zwierze,wiek))
from tabela
group by wlasciciel
order by wlasciciel]]></description>
			<author><![CDATA[dummy@example.com (c_michal)]]></author>
			<pubDate>Tue, 01 Oct 2013 11:21:23 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4731#p4731</guid>
		</item>
		<item>
			<title><![CDATA[Kolumna kótra tryzma w sobie tabelę]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=4726#p4726</link>
			<description><![CDATA[Mam taką tabelę:

właściciel | zwierze    | wiek
----------------------------------
tomek      | pies          | 2 lata
tomek      | kot           | 2 lata
tomek      | pająk        | 3 miesiące

alojzy      | ślimak       | 2 miesiące
alojzy      | komar       | 4 dni
alojzy      | mucha       | 3 dni

amanda  | słoń           | 20 lat
amanda  | żyrafa        | 30 lat
amanda  | hipopotam | 15 lat

Czy można w jakiś sposób otrzymać wynik / tabelę postaci:

właściciel | zwierzęta
----------------------------

tomek      | [ [pies, 2 lata],
                    [kot, 2 lata],
                    [pająk, 3 miesiące] ],


alojzy      | [ [ślimak, 2 miesiące], 
                    [komar, 4 dni],
                    [mucha, 3 dni] ],


amanda  | [ [słoń, 20 lat],
                   [żyrafa, 30 lat],
                   [hipopotam, 15 lat] ]


tzn. chodzi mi o to aby pierwsza kolumna to było imię, 
a druga to była jakby tabela w miejscu gdzie zwyczajnie znajduje się jakaś dana
- czyli aby druga kolumna trzymała w sobie tabelę.]]></description>
			<author><![CDATA[dummy@example.com (tomek)]]></author>
			<pubDate>Tue, 01 Oct 2013 09:39:47 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=4726#p4726</guid>
		</item>
	</channel>
</rss>
