有没有人使用tablefunc
来透视多个变量,而不是只使用 row name?The documentation notes:
对于具有相同row_name值的所有行,“额外”列应该相同。
我不知道如何在不结合我想要旋转的列的情况下完成这一任务(我非常怀疑这会给予我所需要的速度)。一种可能的方法是将实体设为数字,并将其添加到localalt中,以毫秒为单位,但这似乎是一种不稳定的方式。
我编辑了回答这个问题时使用的数据:PostgreSQL Crosstab Query。
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)
,('2012-01-02', 'b', 1, 3)
,('2012-01-02', 'c', 0, 4);
SELECT * FROM crosstab(
'SELECT timeof, entity, status, ct
FROM t4
ORDER BY 1,2,3'
,$$VALUES (1::text), (0::text)$$)
AS ct ("Section" timestamp, "Attribute" character, "1" int, "0" int);
退货:
Section | Attribute | 1 | 0
---------------------------+-----------+---+---
2012-01-01 00:00:00 | a | 1 | 2
2012-01-02 00:00:00 | **b** | 3 | 4
因此,如文档所述,假设 extra 列(又名“Attribute”)对于每个 * 行名称 (又名“Section”)都是相同的。因此,它报告第二行的B,即使'entity'也具有用于'timeof'值的*'c'**值。
预期输出:
Section | Attribute | 1 | 0
--------------------------+-----------+---+---
2012-01-01 00:00:00 | a | 1 | 2
2012-01-02 00:00:00 | b | 3 |
2012-01-02 00:00:00 | c | | 4
有什么想法或参考资料吗?
更多背景:我可能需要对数十亿行执行此操作,我正在测试以long和wide格式存储此数据,并查看是否可以使用tablefunc
从long格式到wide格式,比使用常规聚合函数更有效。
我每分钟会对大约300个实体进行大约100次测量。通常,我们需要比较给定实体在给定秒内进行的不同测量,因此我们需要经常使用宽格式。此外,对特定实体进行的测量是高度可变的。
编辑:我找到了一个关于这个的资源:http://www.postgresonline.com/journal/categories/24-tablefunc。
3条答案
按热度按时间3j86kqsm1#
查询的问题在于**
b
和c
共享相同的时间戳2012-01-02 00:00:00
,并且在查询中timestamp
列timeof
排在第一位,因此-即使您添加了粗体强调-b
和c
只是属于同一组2012-01-02 00:00:00
的额外列。仅返回第一个(b
),因为(引用手册):row_name
列必须是第一列。category
和value
列必须是最后两列。row_name
和category
之间的任何列都被视为“extra”。对于具有相同row_name
值的所有行,“额外”列预期是相同的**。大胆强调我的。
只需还原前两列的顺序,使
entity
作为行名称,它就可以按需要工作:entity
必须是唯一的。重申
***
row_name
***第一个 *extra
*列 * 下一个 *category
(由第二个参数定义)和value
**last。额外的列从每个
row_name
分区的 * 第一 * 行开始填充。忽略其他行的值,每个row_name
只有一列要填充。通常情况下,row_name
的每一行都是相同的,但这取决于您。基础知识:
对于不同的设置in your answer:
难怪你的测试中的查询表现糟糕。您的测试设置有1400万行,在使用
LIMIT 1000
丢弃大多数行之前,您可以处理所有行。对于精简的结果集,向源查询添加WHERE
条件或LIMIT
!此外,您使用的阵列在此基础上不必要地昂贵。我用
dense_rank()
生成了一个代理行名称。db〈〉fiddle here-具有更简单的测试设置和更少的行。
tpxzln5u2#
在我最初的问题中,我应该将这个用于我的样本数据:
有了这个,我必须同时关注时间和实体。由于
tablefunc
只使用一列进行旋转,所以需要找到一种方法将两个维度都填充到该列中。(http://www.postgresonline.com/journal/categories/24-tablefunc)。我使用了数组,就像那个链接中的例子一样。FWIW,我尝试使用字符数组,到目前为止,它看起来这是更快的我的设置;9.2.3 PostgreSQL。
这是结果和期望的输出。
我很好奇这在一个更大的数据集上的表现如何,并将在稍后的日期报告。
fdbelqdn3#
好的,我在一个离我的用例更近的table上运行了这个。要么我做错了,要么交叉表不适合我使用。
首先,我做了一些类似的数据:
然后我运行了几次交叉表代码:
在第三次尝试时获得:
然后我运行了几次标准溶液:
在第三次尝试时获得:
因此,对于我的情况,到目前为止,交叉表似乎不是一个解决方案。而这只是一天,我会有很多年。事实上,我可能不得不使用宽格式(非规范化)表,尽管为实体进行的测量是可变的,并且会引入新的测量,但我不会在这里深入讨论。
以下是我使用Postgres 9的一些设置。2.3: