2013-01-24 91 views
2

我試圖做我在PostgreSQL(8.4 +)中稱之爲「反向計數(*)」的操作。我希望我的輸出有相同的行數在每個字母總數列中指定的數...Postgres「reverse count(*)」(unnest?)

表1:

letter | total 
------------- 
a | 3 
b | 2 
c | 4 
d | 1 

預計表輸出:

letter 
----- 
a 
a 
a 
b 
b 
c 
c 
c 
c 
d 

我不確定是否以及如何在這裏使用最簡單的功能....

+0

爲什麼你需要重複這樣很多字符串? – 2013-01-27 08:38:05

回答

3

是 - 不一定是你想要的(一旦你有一個陣列的課程)

richardh=> SELECT array_fill(letter, ARRAY[total]) FROM expand; 
array_fill 
------------ 
{a,a,a} 
{b,b} 
{c,c,c,c} 
{d} 
(4 rows)  

richardh=> SELECT unnest(array_fill(letter, ARRAY[total])) FROM expand; 
unnest 
-------- 
a 
a 
a 
b 
b 
c 
c 
c 
c 
d 
(10 rows) 
+0

謝謝理查德,在你的幫助下,我能夠做我想做的事情:SELECT UNNEST(array_fill)FROM \t(從表1中選擇array_fill(字母,數組[[CAST(total AS int)]))作爲表格輸出 \t ORDER BY 1; –

+0

@ Marie-HeleneV。這裏的[SQL小提琴](http://sqlfiddle.com/#!11/2e31f/2)爲您的解決方案 –

1

這裏是使用計數或數字表格而不是UNNEST的解決方案。這是一個相當跨平臺的解決方案,因爲每個數據庫都有一個用於創建數字表的解決方案,儘管大多數不如postgresql。

SELECT Letter 
FROM 
    table1 
    INNER JOIN generate_series(1,100) num 
    ON table1.total >= num 
ORDER BY Letter 

SQL Fiddle Demo

我硬編碼了generate_series到100然而,隨着Clodoado表明你可以在調用中使用MAX(Total)到Generate_series

SELECT Letter 
FROM 
    table1 
    INNER JOIN 
    generate_series(
     1, 
     (select max(total) from table1) 
    ) num ON table1.total >= num 
ORDER BY Letter 

SQL Fiddle Demo

+0

這將是'(從表1選擇最大(總))'[SQL小提琴](http:// sqlfiddle.com/#!11/2e31f/12) –

+0

@Clodoaldo謝謝。我很難讓這個工作。我沒有意識到在SELECT中加入'()'是要做的事情。 –