2013-01-24 55 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中加入'()'是要做的事情。 –