1

データのフォーマットは次のとおりです。

item_name | item_serial | sub_group | conc_stuff | other_data | more_data
----------+-------------+-----------+------------+------------+-----------
foo        bar-01-a      widget      b-3          towel        dent
foo        bar-02-a      widget      a-1          42           mouse
foo        bar-03-a      widget      p-1          babel        dolphin
foo3       bar-21-f      widget      f-1          42           marvin
foo3       bar-22-f      widget      x-1          poetry       vogon

希望どおりに実行するためのクエリを取得しました。問題は、より多くのデータを返す必要があることです。

SELECT item_name, 
       array_to_string(array_agg(conc_stuff), ',') as stuff 
FROM dataset 
WHERE some_selector = 'X' 
GROUP BY item_name 
ORDER BY item_name;

私は、単純でありながら論理的に見えるものを試しました。

SELECT item_name, 
       item_serial, 
       sub_group, 
       array_to_string(array_agg(conc_stuff), ',') as stuff 
FROM dataset 
WHERE some_selector = 'X' 
GROUP BY item_name 
ORDER BY item_name;

次のようなものを返す必要があります。

item_name | item_serial | sub_group |   stuff
----------+-------------+-----------+-------------
foo        bar-01-a      widget      a-1,b-3,p-1
foo3       bar-21-f      widget      f-1,x-1,g-5
foo6       bar-81-z      widget      r-1,d-8,w-0

これだけではなく:

item_name |   stuff
----------+--------------
foo        a-1,b-3,p-1
foo3       f-1,x-1,g-5
foo6       r-1,d-8,w-0

クエリにフィールドを追加しようとすると、次のようになります。

ERROR: column "stuff.item_serial" must appear in the GROUP BY clause or be used in an aggregate function

しかし、GROUP BYitem_serialはしたくありません。アグリゲートとともに返されるだけですよね?

サブクエリを実行する必要がありますか?これは簡単だと思います。複数の方法がある場合、どれが最も効率的ですか?連結するテキストの一部は座標(テキストの大きな文字列)です。

4

2 に答える 2

2

持っている名前ごとに 1 つの値を選択する必要があります。各名前を一度だけ返すことはできませんが、item_serial値を複数回返すことはできません。

グループ値として存在する値から 1 つの値を選択するには、集計関数を使用します。

SELECT item_name,
       min(item_serial),
       min(sub_group),
       array_to_string(array_agg(conc_stuff),',') AS stuff
FROM dataset
WHERE sub_group = 'widget'
GROUP BY item_name
ORDER BY item_name;

これは、名前ごとに「最初」item_serialに選択します。sub_group

最後の値が必要な場合は、max代わりに使用してください。

ただし、理解しておくべき重要なことは、グループ化されていない列に対して 1 つの値を選択する必要があるということです。また、 1 つの値を取得する集計関数を指定して、DBMS が使用する必要があるものを正確に伝える必要があります。

SQLFiddle の例: http://www.sqlfiddle.com/#!1/58009/1

于 2012-09-11T20:17:42.417 に答える
1

Postgres 8.4 は、これに関して最近のバージョンの Pg よりもいくらか厳密です。を使用する場合GROUP BY、集約関数を含まないすべてのフィールドをグループ化する必要があります。

Pg9.1 から、GROUP BY主キーを指定すると、グループ化されていない他のすべてのフィールドを省略できるようになりました。

それが役に立てば幸い。

編集:

SELECT 
  item_name, 
  item_serial, 
  sub_group, 
  array_to_string(array_agg(conc_stuff), ',') as stuff 
FROM 
  dataset 
WHERE 
  some_selector = 'X' 
GROUP BY 
  item_name,
  item_serial,
  sub_group 
ORDER BY 
  item_name;
于 2012-09-11T19:03:33.410 に答える