【问题标题】:Postgres: buckets always filled from left in crosstab queryPostgres:在交叉表查询中,桶总是从左边填充
【发布时间】:2012-06-17 20:19:45
【问题描述】:

我的查询如下所示:

SELECT mthreport.*
FROM crosstab
('SELECT 
to_char(ipstimestamp, ''mon DD HH24h'') As row_name, 
varid::text || log.varid || ''_'' || ips.objectname::text As bucket, 
COUNT(*)::integer As bucketvalue
FROM loggingdb_ips_boolean As log 
INNER JOIN IpsObjects As ips 
ON log.Varid=ips.ObjectId
WHERE ((log.varid = 37551) 
OR (log.varid = 27087) 
OR (log.varid = 50876)
OR (log.varid = 45096)
OR (log.varid = 54708)
OR (log.varid = 47475)
OR (log.varid = 54606)
OR (log.varid = 25528)
OR (log.varid = 54729))
GROUP BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, bucket        
ORDER BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, bucket' )

As mthreport(item_name text,  varid_37551 integer, 
            varid_27087  integer , 
            varid_50876  integer , 
            varid_45096  integer , 
            varid_54708  integer , 
            varid_47475  integer , 
            varid_54606  integer , 
            varid_25528  integer , 
            varid_54729  integer , 
            varid_29469 integer)

可以使用以下连接字符串针对测试表测试查询: "host=bellariastrasse.com port=5432 dbname=IpsLogging user=guest password=guest"

查询在语法上是正确的并且运行良好。我的问题是 COUNT(*) 值总是填充最左边的列。然而,在许多情况下,左列应该有一个零或 NULL,并且只有第 2(或第 n)列应该被填充。我的大脑正在融化,我无法弄清楚出了什么问题!

【问题讨论】:

  • 我正在尝试连接 psql,但 pg_hba.conf 验证失败。
  • 哎呀-对不起。我匆忙设置了访客帐户,可能搞砸了一些事情。我今天会检查那里有什么问题。
  • 连接现在应该已经修复了。可以再试一次吗?

标签: postgresql crosstab


【解决方案1】:

解决您的问题的方法是使用带有两个参数crosstab() 变体。

第二个参数(另一个查询字符串)生成输出列的列表,以便正确分配数据查询(第一个参数)中的 NULL 值。

检查manual for the tablefunc extension,尤其是crosstab(text, text)

交叉表的单参数形式的主要限制是 它对组中的所有值一视同仁,将每个值插入 第一个可用列。如果您希望值列对应于 特定类别的数据,并且某些组可能没有数据 有些类别,效果不好。二参数形式 的交叉表通过提供一个明确的列表来处理这种情况 与输出列对应的类别

强调我的。我最近发布了几个相关的答案hereherehere

【讨论】:

  • 谢谢 Erwin,kiss-de-hoand gnä'herr(='you da man',粗略翻译)!我将尝试 2 参数查询并报告!
  • Bingo - 我按照 Erwin 的说明设置了第二个查询,现在一切正常!接下来我将尝试使用一个函数来提供类别字段。在我看来,FUNCTION 方法是一个很好的解决方法,它可以生成“动态”交叉表,其类别可能事先不知道。我说的对吗?
  • @aag:“Küss die Hand gnä' Frau!”会是老式的维也纳式问候,但实际上只针对女性——在公共场合同性之间的亲吻在旧奥地利帝国并不流行。 :D
  • @aag:关于动态函数:只有返回类型相同才能做到这一点。否则,您将不得不返回包含未知列的记录 - 这会让您回到开始的位置。
  • 我在尝试生成函数时仍然遇到很多麻烦。枢轴应位于计算字段 varid::text ||对数变量 || ''_'' || ips.objectname::text FROM loggingdb_ips_boolean As log INNER JOIN IpsObjects As ips ON log.Varid=ips.ObjectId;但我真的不知道如何编写一个函数来提取这些值。你能帮我一把吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
相关资源
最近更新 更多