2016-05-25 23 views
0

以下のコードの一部が余分な場合は謝罪しますが、私がやろうとしているすべての画像を描きたいと思っています。postgresのarray_agg関数とstring_agg関数の最初の結果

私の意図は

  1. pickupLocationsと呼ばれるJSON配列から要素を選択しています。 id_referralにはpickupLocationsが多数あります。 以下のraw_addressesという名前のCTEを参照してください。および

  2. 文字列集約関数(例:string_agg)を使用して、各id_referralの区切りフィールドを作成します。言い換えれば

、私は私の最後の選択で

#id_referral pickup_addresses 
#1 4265 Hillsdale Ave. NE, Grand Rapids, MI 49525 | 3060 Cheney Ave. NE, Grand Rapids, MI 49525 
#2 805 Kendalwood St. NE, Grand Rapids, MI 49505 | 711 Edgewood St. NE, Grand Rapids, MI 49505 

に私のraw_addresses CTE

#id_referral pickup_addresses 
#1 4265 Hillsdale Ave. NE, Grand Rapids, MI 49525 
#1 3060 Cheney Ave. NE, Grand Rapids, MI 49525 
#2 805 Kendalwood St. NE, Grand Rapids, MI 49505 
#2 711 Edgewood St. NE, Grand Rapids, MI 49505 

から行くことができるようにしたいです。

以下のコードを使用している場合しかし、私は今、次のような結果に

#id_referral pickup_addresses 
#1 4265 Hillsdale Ave. NE, Grand Rapids, MI 49525 | 4265 Hillsdale Ave. NE, Grand Rapids, MI 49525 
#2 805 Kendalwood St. NE, Grand Rapids, MI 49505 | 805 Kendalwood St. NE, Grand Rapids, MI 49505 

を取得しています。何らかの理由

WITH raw_addresses AS (
     SELECT sr.id AS id_referral, 
     --parsing a json array which has many pickupLocations for a single id_referral 
      json_array_elements(sr."pickupLocations") -> 'pickupLocationAddress' AS pickup_address 
      FROM "ServiceReferrals" sr 
     ) 
--want to roll the pickup addresses into a single pipe-delimited field (willing work through an array too as shown with array_agg, but same problem there) 
SELECT raw_addresses.id_referral, 
    string_agg(cast(pickup_address as varchar(100)), '|') AS pickup_addresses 
    FROM raw_addresses 
    GROUP BY raw_addresses.id_referral 

string_agg機能は、各id_referralの最初の値を繰り返しています。私もagg_arrayを試して、同じ動作を得る。

理由については、どんなに高く評価されるだろう。

+0

ただ、ダブルチェックに、 'raw_addresses'のためのあなたのCTEは、実際にあなたが説明してきた出力(例えばを生成しますが、' raw_addresses' SELECT * FROMんでしたその出力を得るために)? – Gerrat

+0

@gerrat、no - CTEは期待どおりに動作します。私は 'pickupLocationAddress'を' pickupLocations'(各 'id_referral'の多く)からの要素として取得しています。最終的な結果は最終的な選択からのみ得られます。期待通り 'string_agg'は多少動作している - 誰もが(私は)Rでの分析のためにこれを実装しようとしている場合、それはだけではなく、それぞれのユニークな' pickupLocationAddress' – joemienko

+0

を区切るの(パイプで区切られた)「最初の」 'pickupLocationAddress'を繰り返しています、私はdplyrで仕事を得ているこの答えに出くわしましたhttp://stackoverflow.com/a/28752857/2364325 – joemienko

答えて

0

あなたは中間のCTEを使用して試みることができる:。

WITH raw_addresses AS (
    SELECT sr.id AS id_referral, 
    --parsing a json array which has many pickupLocations for a single id_referral 
     json_array_elements(sr."pickupLocations") -> 'pickupLocationAddress' AS pickup_address 
     FROM "ServiceReferrals" sr 
), transformed_addresses AS (
    SELECT id_referral, 
    cast(pickup_address as varchar(100)) AS pickup_address 
    FROM raw_addresses 
) 
SELECT id_referral, 
string_agg(pickup_address, '|') AS pickup_addresses 
FROM transformed_addresses 
GROUP BY id_referral 
+0

ありがとう!私はこのDBへのリモートアクセスを持っていませんが、私はこれをtmrでチェックします。 – joemienko

+0

DBでこのコードを実行すると、同じ問題が発生します。つまり、ここに示すように:http://sqlfiddle.com/#!15/e9839/3、あなたのコードは期待どおりに動作しますので、私は答えを受け入れています。私の具体的な問題は、現時点では再現できない特定のDB設定やテーブルではっきりしない問題でなければなりません。上記のように、私は非SQLソリューションでこの問題を解決しました。 – joemienko