Function 带$libdir/tablefunc交叉表\u哈希函数的postgres交叉表查询

Function 带$libdir/tablefunc交叉表\u哈希函数的postgres交叉表查询,function,postgresql,pivot,crosstab,Function,Postgresql,Pivot,Crosstab,我的交叉表查询(见下文)运行得很好。然而,我必须生成大量这样的查询,而且至关重要的是,列定义的数量每天都会有所不同。如果输出columndefs的数量与交叉表的第二个参数的数量不匹配,则交叉表将抛出、出错并中止。因此,我不能像在当前查询中那样“硬连接”列定义,而是需要一个函数来确保列定义能够动态同步。是否可以编写一个通用的postgres函数,在所有这样的实例中都可以重用?我的问题是: SELECT * FROM crosstab ('SELECT to_char(ipstimestamp,

我的交叉表查询(见下文)运行得很好。然而,我必须生成大量这样的查询,而且至关重要的是,列定义的数量每天都会有所不同。如果输出columndefs的数量与交叉表的第二个参数的数量不匹配,则交叉表将抛出、出错并中止。因此,我不能像在当前查询中那样“硬连接”列定义,而是需要一个函数来确保列定义能够动态同步。是否可以编写一个通用的postgres函数,在所有这样的实例中都可以重用?我的问题是:

SELECT *
FROM crosstab
('SELECT 
to_char(ipstimestamp, ''mon DD HH24h'') As row_name, 
ips.objectid::text As category, 
COUNT(*)::integer As value
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 = 29469)   
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, category     
 ORDER BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, category', 

 'SELECT DISTINCT varid 
 FROM loggingdb_ips_boolean ORDER BY 1;' 
 )

 As CountsPerHour(row_name text,  
 "25528" integer,
 "27087" integer,
 "29469" integer,
 "37551" integer,
 "45096" integer,
 "54606" integer,
 "54708" integer,
 "54729" integer)
PS:请注意,此查询可以在以下服务器上针对测试数据运行: 主持人:bellariastrasse.com 数据库:ipsloging 用户:来宾
密码:guest

恐怕您想要的不完全可能。如果返回类型不同,您可以

  • 创建一个返回通用
    记录集的函数
但是,您必须在每次调用时提供一个列定义列表,使您回到开始的位置

  • 为每个不同的情况创建一个具有匹配返回类型的新函数
但这正是你想要避免的

如果您必须编写“大量此类查询”,则可以使用查询生成器函数,该函数将不返回结果,而是在第二步中执行的DDL脚本。基本上是一个函数,它接受变量部分作为参数,并在示例中生成查询字符串<代码>返回文本

这可能会变得相当复杂。必须考虑几个相互重叠的元级别,但这是绝对可能的。一定要大量使用,以防止引用疯狂