我正在尝试在 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 函数....
我正在尝试在 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 函数....
是的 - 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)
这是使用计数或数字表而不是UNNEST
. 这是一个相当跨平台的解决方案,因为每个数据库都有一个用于创建数字表的解决方案,尽管大多数不如 postgresql 好。
SELECT Letter
FROM
table1
INNER JOIN generate_series(1,100) num
ON table1.total >= num
ORDER BY Letter
我将其硬编码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