2

我正在尝试在 PostgreSQL(8.4 +)中做我称之为“反向计数(*)”的事情。我希望我的输出具有与每个字母的总列中指定的行数完全相同的行数......

表格1:

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

预期的表格输出:

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

我不确定是否以及如何在此处使用 unnest 函数....

4

2 回答 2

3

是的 - unnest 是你想要的(当然,一旦你有一个数组)

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)
于 2013-01-24T18:30:00.367 回答
1

这是使用计数或数字表而不是UNNEST. 这是一个相当跨平台的解决方案,因为每个数据库都有一个用于创建数字表的解决方案,尽管大多数不如 postgresql 好。

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

SQL 小提琴演示

我将其硬编码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 小提琴演示

于 2013-01-28T02:21:49.280 回答