From: | "N(dot) Can KIRIK" <can(at)epati(dot)com(dot)tr> |
---|---|
To: | Recep KIRMIZI <rkirmizi(at)gmail(dot)com> |
Cc: | Sinan Duman <sinanduman(at)gmail(dot)com>, "pgsql-tr-genel(at)postgresql(dot)org" <pgsql-tr-genel(at)postgresql(dot)org> |
Subject: | Re: [pgsql-tr-genel] Re: [pgsql-tr-genel] array_agg kullanımı |
Date: | 2014-02-25 19:35:24 |
Message-ID: | CAJ1wP5mnRA6LD1BVnOjfD-OBYgm5jScUOspc392P4jHKr8mo1w@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-tr-genel |
selam,
array_agg kullanımında 9.2'den itibaren karşılaştığım bir anormal
davranıştan bahsedeyim, ufak bir uyarı niteliğinde.
grup sorgularında kayıtların birleştirilen satıra girme sıralamasının
önemli olduğu durumlarda, birleştirme fonksiyonlarında mutlaka ORDER BY
kullanmak gerekiyor.
9.2 öncesinde sıralama sorguya giriş sırasına göre sabit kalırken, 9.2'den
itibaren sıralamalar her ifade için farklı olabiliyor. belgelendirmelerde
ifade edilmeyen bu davranış değişikliği zamanında biraz saç baş yoldurmuştu
bana.
özellikle birden fazla ARRAY_AGG kullanımı söz konusu olduğunda mutlaka tüm
ifadelerin aynı sıralamaya tabi olduğunu garantilemek gerekiyor.
sorgunuzu şu şekilde revize etmenizi öneririm:
SELECT
> "product_id"
> ,ARRAY_AGG( "updated_at" *ORDER BY* "updated_at" ) AS "updated"
> ,ARRAY_AGG( "price" *ORDER BY* "updated_at" ) AS "prices"
> FROM
> "ebebek_productupdate"
> GROUP BY
> "product_id"
> ;
2014-02-25 19:25 GMT+02:00 Recep KIRMIZI <rkirmizi(at)gmail(dot)com>:
> Tam istediğim degil ama doğru bakış açısını anladım (Hatalıysam düzeltin
> lütfen). gruplanacak elemanı aggregation 'a sokmuyoruz. diğerlerini
> sokuyoruz. Sizin yazdığınızı biraz değiştirdim çünkü tip 'e cast etmek ile
> ilgili bir hata verdi.
>
> ebebek=# select updated_at, array_agg(product_id::text,',') from
> ebebek_productupdate group by product_id;
> ERROR: function array_agg(text, unknown) does not exist
>
> Şimdiki hali:
>
> ebebek=# select product_id, array_agg(updated_at) as updated,
> array_agg(price) as prices from ebebek_productupdate group by product_id;
> -[ RECORD 1
> ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> product_id | 1
> updated | {"2014-02-25 18:57:37.918435+02","2014-02-25
> 18:55:53.858926+02","2014-02-25 18:53:24.424278+02","2014-02-25
> 17:34:27.762801+02","2014-02-25 17:33:41.818229+02","2014-02-25
> 17:33:34.807815+02"}
> prices | {59.90,59.90,59.90,15.23,10.11,20.11}
> -[ RECORD 2
> ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> product_id | 2
> updated | {"2014-02-25 18:57:37.942396+02","2014-02-25
> 18:55:53.88388+02","2014-02-25 18:53:24.449021+02"}
> prices | {59.90,59.90,59.90}
> -[ RECORD 3
> ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> product_id | 3
> updated | {"2014-02-25 18:57:37.966292+02","2014-02-25
> 18:55:53.907771+02","2014-02-25 18:53:24.473005+02"}
> prices | {9.90,9.90,9.90}
> -[ RECORD 4
> ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> product_id | 4
> updated | {"2014-02-25 18:57:37.990305+02","2014-02-25
> 18:55:53.931796+02","2014-02-25 18:53:24.497069+02","2014-02-25
> 17:34:37.01767+02"}
> prices | {39.90,39.90,39.90,22.22}
> -[ RECORD 5
> ]-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> product_id | 5
> updated | {"2014-02-25 18:57:38.01532+02","2014-02-25
> 18:55:53.955814+02","2014-02-25 18:53:24.521036+02"}
> prices | {27.99,27.99,27.99}
>
>
> buradaki hali işimi görüyor. updated ve prices alanlarındaki elemanların
> indisleride birbirini tutuyor. Yani 1. kayıt için updated[0] değeri ile
> prices[0] değeri birbiri ile eşleşiyor.
>
> Teşekkürler.
>
> yani updated[0] =
>
>
>
>
> 25 Şubat 2014 19:00 tarihinde Sinan Duman <sinanduman(at)gmail(dot)com> yazdı:
>
> select product_id, array_agg(updated_at::text,',') from
>> ebebek_productupdate group by product_id;
>>
>> 25 Şub 2014 tarihinde 18:44 saatinde, Recep KIRMIZI <rkirmizi(at)gmail(dot)com>
>> şunları yazdı:
>>
>> > Merhabalar;
>> > Aşağıda ki gibi bir tablom var,
>> >
>> > ebebek=# SELECT * from ebebek_productupdate;
>> > id | product_id | price | updated_at
>> > ----+------------+-------+-------------------------------
>> > 1 | 1 | 20.11 | 2014-02-25 17:33:34.807815+02
>> > 2 | 1 | 10.11 | 2014-02-25 17:33:41.818229+02
>> > 3 | 1 | 15.23 | 2014-02-25 17:34:27.762801+02
>> > 4 | 4 | 22.22 | 2014-02-25 17:34:37.01767+02
>> > (4 rows)
>> >
>> >
>> > ben bu ürünleri product_id 'ye göre gruplamak ve her bir product_id
>> için tek satır olacak şekilde görmek istiyorum. Yani ilk 3 satır benim için
>> tek satır olmalı.
>> >
>> > Amaç ürünün farklı zamanlardaki fiyat güncellemelerini, aynı satırda,
>> tarih ve fiyatları ile birlikte gösterebilmek.
>> >
>> > Gruplama işini id 'ye göre yapıyor ama bu bana istediğim sonucu
>> döndürmüyor:
>> >
>> > ebebek=# select array_agg(product_id) as pids, price, updated_at from
>> ebebek_productupdate group by id;
>> > pids | price | updated_at
>> > ------+-------+-------------------------------
>> > {1} | 20.11 | 2014-02-25 17:33:34.807815+02
>> > {1} | 10.11 | 2014-02-25 17:33:41.818229+02
>> > {1} | 15.23 | 2014-02-25 17:34:27.762801+02
>> > {4} | 22.22 | 2014-02-25 17:34:37.01767+02
>> > (4 rows)
>> >
>> > ebebek=# select array_agg(product_id) as pids, price, updated_at from
>> ebebek_productupdate group by pids;
>> > ERROR: aggregates not allowed in GROUP BY clause
>> > LINE 1: select array_agg(product_id) as pids, price, updated_at from...
>> >
>> >
>> > Vel hasılı aggregate yaptığım sütuna göre gruplamak istiyorum. Zaten
>> aggregate yapmamdaki amaç ta bu. Lakin konuya hakim değilim.
>> >
>> > Tavsiyesi olan?
>> >
>> >
>> > --
>> > Saygılarımla... Recep KIRMIZI
>>
>
>
>
> --
> Saygılarımla... Recep KIRMIZI
>
From | Date | Subject | |
---|---|---|---|
Next Message | Recep KIRMIZI | 2014-02-26 08:58:29 | Re: [pgsql-tr-genel] Re: [pgsql-tr-genel] array_agg kullanımı |
Previous Message | Recep KIRMIZI | 2014-02-25 17:25:44 | Re: [pgsql-tr-genel] array_agg kullanımı |