2012-10-31 26 views
2

从我刚才的问题跟进:如何将查询结果分解为单独的列?

Pixel values of raster records to be inserted in the table as columns

想象我的查询结果有5300行作为类似的结果:

+-------+ 
|value | 
+-------+ 
| 15624 | 
| 15899 | 
| 56267 | 
| 85955 | 
+-------+ 

我希望他们能在val1表和第53行列,val2列中的第53行等。最后,我的桌子上将有100个新的列。这可能吗?如果是这样,我该如何实现它?

+1

抬头看看PIVOTING – Randy

+1

我得问......为什么?我很努力想看看它如何能起到任何有用的作用。一般来说,你所追求的是一个“数据透视”或“交叉表”查询(这在PostgreSQL中令人生厌),但这只是一个想要的事情。你试图解决这个问题的根本问题是什么,你想这么做的原因是什么? –

+2

下面介绍如何生成100个每个有530个值的数组。如果你真的想要,你可以交叉表达结果。 'select array_agg(x)from generate_series(1,53000)x GROUP BY width_bucket(x,1,53000,100)ORDER BY 1;'。当然你会用你的表来替换'generate_series'。请注意,这些值在数组内没有排序。如果你想要有序数组,你需要使用'array_agg'作为窗口函数的更慢的方法。 –

回答

1

这是possibly somewhat saner approach using multi-dimensional arrays

请永远,永远,永远,永远使用以下查询:

CREATE EXTENSION tablefunc; 

SELECT * FROM crosstab(
    'SELECT ''row1''::text, width_bucket(x, 1, 53001, 100), array_agg(x order by x)::integer[] from generate_series(1,53000) x GROUP BY 2' 
) ct(
rowname text, 
    col1 integer[], col2 integer[], col3 integer[], col4 integer[], col5 
    integer[], col6 integer[], col7 integer[], col8 integer[], col9 integer[], 
    col10 integer[], col11 integer[], col12 integer[], col13 integer[], col14 
    integer[], col15 integer[], col16 integer[], col17 integer[], col18 integer[], 
    col19 integer[], col20 integer[], col21 integer[], col22 integer[], col23 
    integer[], col24 integer[], col25 integer[], col26 integer[], col27 integer[], 
    col28 integer[], col29 integer[], col30 integer[], col31 integer[], col32 
    integer[], col33 integer[], col34 integer[], col35 integer[], col36 integer[], 
    col37 integer[], col38 integer[], col39 integer[], col40 integer[], col41 
    integer[], col42 integer[], col43 integer[], col44 integer[], col45 integer[], 
    col46 integer[], col47 integer[], col48 integer[], col49 integer[], col50 
    integer[], col51 integer[], col52 integer[], col53 integer[], col54 integer[], 
    col55 integer[], col56 integer[], col57 integer[], col58 integer[], col59 
    integer[], col60 integer[], col61 integer[], col62 integer[], col63 integer[], 
    col64 integer[], col65 integer[], col66 integer[], col67 integer[], col68 
    integer[], col69 integer[], col70 integer[], col71 integer[], col72 integer[], 
    col73 integer[], col74 integer[], col75 integer[], col76 integer[], col77 
    integer[], col78 integer[], col79 integer[], col80 integer[], col81 integer[], 
    col82 integer[], col83 integer[], col84 integer[], col85 integer[], col86 
    integer[], col87 integer[], col88 integer[], col89 integer[], col90 integer[], 
    col91 integer[], col92 integer[], col93 integer[], col94 integer[], col95 
    integer[], col96 integer[], col97 integer[], col98 integer[], col99 integer[], 
    col100 integer[] 
); 

正确的方式来解决这个问题,几乎可以肯定是在您的应用程序。 SQL擅长很多事情。这不是其中之一,特别是在PostgreSQL中,它的支持非常有限。在任何数据库中,这将是一件非常疯狂的事情。

就我而言,如果我要使用查询只生成列清单,这就是系统正在被迫做一些它不能很好地适合于一个标志:

select string_agg('col'||n||' integer[]',', ') FROM generate_series(1,100) n; 
+1

我很想用!谢谢 –

+1

@f。ashouri我刚纠正了查询中的错误;我应该使用100个width_buckets,范围为1-53001 –

+1

@ f.ashouri:强壮;抵制诱惑! –

相关问题