首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres“反向计数(*)”(unnest?)

Postgres“反向计数(*)”(unnest?)
EN

Stack Overflow用户
提问于 2013-01-25 01:28:41
回答 2查看 955关注 0票数 2

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

表1:

代码语言:javascript
复制
letter | total
-------------
a | 3
b | 2
c | 4
d | 1

期望表输出:

代码语言:javascript
复制
letter
-----
a
a
a
b
b
c
c
c
c
d

我不确定是否以及如何在这里使用unnest函数。

EN

回答 2

Stack Overflow用户

发布于 2013-01-25 02:30:00

是的-un嵌套是你想要的(当然,一旦你有了一个数组)

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2013-01-28 10:21:49

以下是使用计数或数字表而不是UNNEST的解决方案。它是一个相当跨平台的解决方案,因为每个数据库都有一个创建numbers表的解决方案,尽管大多数没有postgresql那么好。

代码语言:javascript
复制
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)

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14507198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档