1

Temat: Kolumna kótra tryzma w sobie tabelę

2

Odp: Kolumna kótra tryzma w sobie tabelę

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

3

Odp: Kolumna kótra tryzma w sobie tabelę

4

Odp: Kolumna kótra tryzma w sobie tabelę

5

Odp: Kolumna kótra tryzma w sobie tabelę

6

Odp: Kolumna kótra tryzma w sobie tabelę

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

7

Odp: Kolumna kótra tryzma w sobie tabelę

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

8

Odp: Kolumna kótra tryzma w sobie tabelę

9

Odp: Kolumna kótra tryzma w sobie tabelę

10

Odp: Kolumna kótra tryzma w sobie tabelę

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