我正在尝试在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
我不确定我是否以及如何使用此处的免费功能....
答案 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
我将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