<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Kolumna kótra tryzma w sobie tabelę]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1889&amp;type=atom"/>
	<updated>2013-10-04T13:01:16Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1889</id>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4753#p4753"/>
			<content type="html"><![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]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-10-04T13:01:16Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4753#p4753</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4752#p4752"/>
			<content type="html"><![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;]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-10-04T12:16:16Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4752#p4752</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4751#p4751"/>
			<content type="html"><![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;]]></content>
			<author>
				<name><![CDATA[tomek]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1459</uri>
			</author>
			<updated>2013-10-04T12:06:08Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4751#p4751</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4750#p4750"/>
			<content type="html"><![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]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-10-04T12:04:27Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4750#p4750</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4749#p4749"/>
			<content type="html"><![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]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-10-04T11:38:26Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4749#p4749</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4748#p4748"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[tomek]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1459</uri>
			</author>
			<updated>2013-10-04T11:22:22Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4748#p4748</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4746#p4746"/>
			<content type="html"><![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]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-10-04T10:52:19Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4746#p4746</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4744#p4744"/>
			<content type="html"><![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;
-------------------------------------------------------------------------------------]]></content>
			<author>
				<name><![CDATA[tomek]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1459</uri>
			</author>
			<updated>2013-10-04T09:09:21Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4744#p4744</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4731#p4731"/>
			<content type="html"><![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]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-10-01T11:21:23Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4731#p4731</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Kolumna kótra tryzma w sobie tabelę]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4726#p4726"/>
			<content type="html"><![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ę.]]></content>
			<author>
				<name><![CDATA[tomek]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1459</uri>
			</author>
			<updated>2013-10-01T09:39:47Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4726#p4726</id>
		</entry>
</feed>
