2016-06-17 7 views
0

に基づいて、私はこのようになりますPostegreSQLテーブル内のデータを持っている:グループと集計列の順序とキーフィールド

text      field1 field2 ID 
Lorem ipsum dolor    A  B  1 
Donec tristique ips   A  C  2 
Donec ut imperdiet neque,  A  B  3 
Suspendisse urna nunc,  A  B  4 
tristique auctor libero.  A  C  5 
sem varius nec    A  C  6 

私はフィールド1とフィールド2しばらくして、そのグループのテキスト第2のIDのいくつかの並べ替えを追加したいですテーブルの順序を維持する。このようなもの:

text      field1 field2 ID ID2 
Lorem ipsum dolor    A  B  1  1 
Donec tristique ips   B  C  2  2 
Donec ut imperdiet neque,  A  B  3  3 
Suspendisse urna nunc,  A  B  4  3 
tristique      B  C  5  4 
sem varius nec    B  C  6  4 
sem neque auctor    B  C  7  4 

次に、ID2フィールドに基づいてテキストフィールドをグループ化して集計します。 最終結果は次のようになります。

text             field1 field2 ID2 
Lorem ipsum dolor          A   B   1 
Donec tristique ips         B   C   2 
Donec ut imperdiet neque, Suspendisse urna nunc,  A   B   3  
tristique sem varius necsem neque auctor    B   C   4 

何クエリ私はこの結果を得るために実行する必要があるでしょうか?

は、あなたが任意の集約関数に「内部」の順序付けを与えることができ、

+0

'string_agg(... order by ...)' –

+5

「テーブルの順序」とはどういう意味ですか?テーブルには**の**固有の順序はありません。あなたの 'SELECT'に' ORDER BY'節がなければ、サーバは任意の順序で結果を返すことができます。 'ORDER BY'で指定するカラムがない場合は、データモデルに問題があります。 –

+0

私は上記の例のように、field1とfield2の両方と前の行と同じ場合、私のテキストフィールドを順序で連結することを意味します。 – nickfrenchy

答えて

0

ありがとう:

SELECT array_agg(text ORDER BY id) AS text, 
     field1, field2, 
     row_number() OVER() AS id2 
FROM t 
GROUP BY field1, field2 
ORDER BY id2 

あなたは結果を印刷したり、アプリケーションにそれを引いている場合は、string_aggを使用することを好むかもしれませんarray_aggの代わりに、区切り文字の場合は,となります。

EDIT:行がid順に並んでいたときにここでは、同じfield1 + field2値の「実行」を識別し、クエリされています

SELECT array_agg(text ORDER BY id), 
     field1, field2, 
     row_number() OVER() 
FROM (
     SELECT t.*, 
       (SELECT MIN(t2.id) 
       FROM t t2 
       WHERE t2.id <= t.id 
       AND t2.field1 = t.field1 
       AND t2.field2 = t.field2 
       AND NOT EXISTS (SELECT 1 
            FROM t t3 
            WHERE t3.id < t.id 
            AND  t3.id > t2.id 
            AND  (t3.field1 <> t.field1 
            OR  t3.field2 <> t.field2))) AS g 
     FROM t 
     ) AS x 
GROUP BY g, field1, field2 
ORDER BY g 
; 

私はこのクエリはややばかげて考えると、私はしませんその性能を保証するが、それはあなたが求めていることをする。また、テーブルに自然順序付けがないことを説明する多数の人々を受け入れたくないようでも、関係モデルについての良い本を見つけてそれを読むべきです。

+0

ID2はどのように取得しますか? – nickfrenchy

+0

ハハ、あなたはそれを言いました!だからあなたはそれを生成したいですか? –

+0

ええ、それは私の行方不明でした:P 私はあなたのスクリプトを試して、それは動作しますが、それは私が何を探しているのか正確にはありません。 これは、位置に関係なくすべてのA B、B Cを連結します。 私が探しているのは:ダイアログがあり、1つのダイアログが複数の行にまたがっていると想像してください。ダイアログごとに1つの行が必要です。 – nickfrenchy

関連する問題