|
有人用过吗?tablefunc多个变量而不是仅使用行名称?文档说明:( C' r: K5 _ w) D7 r
相同 row_name 值的所有行,额外列应相同。* K! R9 n( |# C- z9 h; W
我不知道如何在不组合我想旋转列的情况下执行这个操作(我非常怀疑它会给我所需的速度)。一种可能的方法是将实体设置为数字,并将其添加到本地,但这似乎是一种不稳定的方法。, P; Y0 z K1 |! w+ \3 j. J
在回答这个问题时,我时使用的数据:PostgreSQL Crosstab Query。( m7 O5 v9 }# m9 W
CREATE TEMP TABLE t4 ( timeof timestamp ,entity character ,status integer ,ct integer); INSERT INTO t4 VALUES ('2012-01-01','a',1,1) ,('2012-01-01','a,0,2) -01-02','b1、3) -01-02','c,0,4);SELECT * FROM crosstab( SELECT timeof,entity,status,ct FROM t4 ORDER BY $$VALUES (1::text),(0::text)$$) AS ct ("Section" timestamp,"Attribute" character,"1" int,"0" int);返回:
9 _8 q+ K& S: Y7 Y8 \/ e Section | Attribute | 1 | 0--------------------------- ----------- --- --- 2012-01-0100:000:0000 | a | 1 | 2 2012-01-0200:000:0000 | b | 3 | 4因此,正如文档所述,假设每行名称(也称为部分)的额外列(也称为属性)是相同的。因此,它向第二行报告b,即使 ‘entity’ 也有这个 ‘timeof’ 值的’c ‘ 值。
2 b1 t# Y C2 h& r期望输出:7 X O0 ~, w) ?. V
Section | Attribute | 1 | 0-------------------------- ----------- --- ---2012-01-0100:000:0000 | a | 1 | 22012-01-0200:000:0000 | b | 3 | 2012-01-0200:000:0000 | c | | 4任何想法或参考?7 B8 y6 f% m1 a! `* ]& {
更多背景知识:我可能需要执行数十亿行,我正在测试以长格式和宽格式存储这些数据,并检查它们是否可以使用tablefunc从长格式到宽格式比常规聚合函数更有效。( G- l2 ^7 R5 c6 {. I) E' R
我每分钟测量大约300个 实体大约100个 次。通常,我们需要比较给定实体在给定秒内进行的不同测量,因此我们需要经常使用宽格式。此外,对特定实体的测量是高度可变的。$ S6 d3 Z1 \ w* A
M* R1 m0 o5 [4 m4 z 解决方案:
* Y: W! ]9 H9 E 你的问题是b和c2012年共享相同时间戳-01-02 00:00:00,你在查询中首先有这个timestamp列timeof,因此 -即使你添加了粗体来强调 -b并且c2012年只属于同一组的额外列-01-02 00:00:00。b自(引用手册)以来,只返回第一个 ( ):
# g4 ?, V# d; E该row_name列必须是第一个category与value列必须是最后两列的顺序。row_name和之间的任何列category都被视为额外。对于所有具有相同值的行,额外列应该是相同的row_name。
9 b8 t& T2 m4 V$ [% S9 y大胆强调我的。
2 W! y, J7 n' k& K9 V+ }只需恢复前两列的顺序即可制作entity可按需工作:% ^/ s; [: E" p: x0 Y) {0 v; O
SELECT * FROM crosstab( SELECT entity,timeof,status,ct FROM t4 ORDER BY VALUES (1)AS ct "Attribute" character ,"Section" timestamp ,"status_1" int ,"status_0" int);entity 当然,必须是独一无二的。
" n& s2 [$ t; L+ UReiterate
9 d" I Q7 a" n; trow_name第一的
( M7 h# M. u0 @" ~ w- L( E(可选)extra列下一个. W+ V( _5 [: g; O: {
category(由第二个参数定义)和value last。填写每个分区第一行的额外列row_name。其他行的值将被忽略,每列仅row_name填一列。通常, one 的每一行都是一样的row_name,但这取决于你。
( R0 e& F g6 b0 {0 N* g1 U答案中的不同设置:6 c; b& K* G! l7 c
SELECT localt,entity msrmnt01,msrmnt02,msrmnt03,msrmnt04,msrmnt05 -- ,more?FROM crosstab( SELECT dense_rank() OVER (ORDER BY localt,entity)::int AS row_name localt,entity -- additional columns msrmnt,val FROM test -- WHERE ??? -- instead of LIMIT at the end ORDER BY localt,entity,msrmnt -- LIMIT -- instead of LIMIT at the end $$SELECT generate_series(1,5)$$) -- more? AS ct (row_name int,localt timestamp,entity int ,msrmnt01 float8,msrmnt02 float8,msrmnt03 float8,msrmnt04 float8,msrmnt05 float8 -- ,more? )LIMIT 1000 -- ??!!难怪你的测试查询执行得很差。您的测试设置为 1400 万行,您可以在丢弃大部分之前处理所有这些行LIMIT 1000。对于简化的结果集,向源查询添加 WHERE 条件或 LIMIT!
_* i0 J8 i- f, C) W此外,你使用的阵列不必要昂贵。dense_rank() 生成代理名称。 |
|