Postgres“反向计数(*)”(不要?)

时间:2013-01-24 17:28:41

标签: postgresql count

我正在尝试在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

我不确定我是否以及如何使用此处的免费功能....

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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所示,您可以在对Generate_series的调用中使用MAX(Total)

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