2012-09-11 74 views
1

這是如何格式化數據:Postgres的查詢返回不止ARRAY_AGG

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 

當我嘗試添加廣告時ditional字段添加到查詢,我得到:

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

但我不想GROUP BY item_serial,我只是希望它與骨料被退回,對不對?

我是否需要運行子查詢?我確定這很簡單。如果有多種方法,哪種效率最高?我將連接的一些文本是座標(大文本字符串)。

+1

「item_serial」是唯一的列嗎?如果給定的'item_name'值有多個'item_serial',哪一個應該顯示? –

+0

沒有列,都是基本的。可以有多個item_serials屬於不同的sub_group – roberthuttinger

+0

那麼你想爲特定的'item_name'選擇哪個item_serial(或sub_group)? –

回答

2

你需要選擇你有每名一個值。您不能讓每個名稱只返回一次,而是多次顯示item_serial值。

挑選一個值出那些有一組值的通過集合函數完成:

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; 

這拾取th4e「第一」 item_serialsub_group每個名稱。

如果您想要最後一個值,請改爲使用max

但重要的是要理解的是,你必須爲非分組列選擇一個值。你需要通過提供一個集合函數來告訴數據庫管理系統它應該使用哪一個數據庫,該數據庫選擇一個值。

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

+0

輝煌!這解決了次要問題!我太早檢查了!儘管@greg確實爲我提出的問題提供了正確的解決方案。我對這種混亂表示抱歉。和+10將我介紹給sqlfiddle! – roberthuttinger

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; 
+0

所以我可以選擇其他人,如果我'分組',即使我不需要他們分組?現在我看到了它有意義的例子。我試試這個方法,謝謝! – roberthuttinger

+0

你的答案解決了我開始的問題,但發佈後我意識到這不是我的問題。這是我的邏輯錯誤。 – roberthuttinger